BugBuster1701 / contao-cron-bundle

Contao 4/5 CRON Scheduler Bundle
GNU Lesser General Public License v3.0
2 stars 1 forks source link

Command Aufrufe unterstützen #51

Open BugBuster1701 opened 7 months ago

BugBuster1701 commented 7 months ago

z.B. um das interne DB Backup zu starten. contao-console contao:backup:create --no-interaction --quiet

Idee aus Forum.

Variante 1 (ungetestet, der ruft auch /bin/console auf, nicht die contao-console)

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Annotation\Route;

class MyController extends AbstractController
{
    /**
     * @Route("/myroute", name="myroute")
     */
    public function index(KernelInterface $kernel)
    {
        // Erstellen Sie das Input-Objekt mit den Argumenten, die Sie übergeben möchten
        $input = new ArrayInput([
            'command' => 'cache:clear',
            // Passen Sie die Argumente an Ihre Bedürfnisse an
            '--env' => 'prod',
            '--no-debug' => true,
        ]);

        // Sie können den BufferedOutput verwenden, um die Ausgabe des Befehls zu erhalten
        $output = new BufferedOutput();

        // Holen Sie den Anwendungsdienst und führen Sie den Befehl aus
        $application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel);
        $application->run($input, $output);

        // Die Ausgabe des Befehls zurückgeben
        $content = $output->fetch();

        // ...
    }
}

Variante 2 als Subprocess (ungetestet)

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Process\Process;
use Symfony\Component\Routing\Annotation\Route;

class MyController extends AbstractController
{
    /**
     * @Route("/myroute", name="myroute")
     */
    public function index()
    {
        // Erstellen Sie ein neues Process-Objekt
        $process = new Process(['php', 'bin/console', 'your:command', 'arg1', 'arg2']);
        // Setzen Sie die Umgebungsvariablen FALLS notwendig
        $process->setEnv(['APP_ENV' => 'prod']);

        // Starten Sie den Prozess und übergeben Sie eine Callback-Funktion, um das Ergebnis zu behandeln
        $process->start();

        // Der Rest Ihres Codes wird hier fortgesetzt, während der Prozess im Hintergrund ausgeführt wird

        return new Response('Process started');
    }
}

Hier mit Callback Funktion:

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Process\Process;
use Symfony\Component\Routing\Annotation\Route;

class MyController extends AbstractController
{
    /**
     * @Route("/myroute", name="myroute")
     */
    public function index()
    {
        // Erstellen Sie ein neues Process-Objekt
        $process = new Process(['php', 'bin/console', 'your:command', 'arg1', 'arg2']);
        // Setzen Sie die Umgebungsvariablen FALLS notwendig
        $process->setEnv(['APP_ENV' => 'prod']);

        // Starten Sie den Prozess und übergeben Sie eine Callback-Funktion, um das Ergebnis zu behandeln
        $process->start(function ($type, $buffer) {
            if (Process::ERR === $type) {
                echo 'ERR > '.$buffer;
            } else {
                echo 'OUT > '.$buffer;
            }
        });

        // Der Rest Ihres Codes wird hier fortgesetzt, während der Prozess im Hintergrund ausgeführt wird

        return new Response('Process started');
    }
}

Den Symfony\Component\Process\PhpExecutableFinder wird man noch brauchen um das richtige PHP CLI zu finden.

BugBuster1701 commented 7 months ago
use Symfony\Component\Process\PhpExecutableFinder;
        $phpFinder = new PhpExecutableFinder();
        $phpPath = $phpFinder->find();

        // Erstellen Sie ein neues Process-Objekt
        $process = new Process([$phpPath, 'bin/console', 'your:command', 'arg1', 'arg2']);
BugBuster1701 commented 7 months ago

https://symfony.com/doc/6.4/components/process.html https://symfony.com/doc/6.4/components/process.html#executing-a-php-child-process-with-the-same-configuration Ab Symfony 6, daher eingrenzen in composer.json. "symfony/process": "^6.4",

Falls auch für Contao 4.13 nötig, dann direkt mit Process.