it-swarm.com.de

best Practice, wie Symfony2-Aktionen geplant werden

Meine auf symfony2 basierende Anwendung muss zu unterschiedlichen Zeitpunkten und mit unterschiedlichen Frequenzen einige eigenständige Aufgaben erledigen. Zum Beispiel Newsletter versenden, Bericht bearbeiten ...

Ich möchte in der Lage sein, jede Aufgabe aus der Anwendung heraus hinzuzufügen/zu bearbeiten. Meine Aufgabe würde Cron-Jobs sehr nahe kommen und darin bestehen, eine bestimmte URL aufzurufen.

Aus meiner Sicht :

Ich denke darüber nach, einen Cron-Job zu erstellen, der alle halbe Stunde oder zehn Minuten ein Skript startet. Dieses Skript führt nur einen Curl-Befehl aus, der eine Docronjob-Aktion ausführt. Diese Dokumentationsaktion befindet sich in symfony und ist dafür verantwortlich, alle Aufgaben zu erledigen und die zu erledigende Aufgabe zu starten.

Meine Fragen sind:

  • Gibt es einen saubereren Weg, das zu erreichen?
  • Wie starte ich in der Dokumentation andere Aktionen?
  • Wie schaffe ich es, das Zeitlimit für einen gesamten Controller auf 0 zu setzen?
  • Gibt es dafür bereits ein Bundle?
14
0x1gene

Es hört sich so an, als würden Sie Ihren Zeitplan für Aufgaben in der Datenbank speichern. Kein Problem. Erstellen Sie für jeden Aufgabentyp (z. B. Newsletter senden, Berichte speichern) einen Dienst, der die Aufgabe erledigt. Fügen Sie diesem Dienst dann ein Tag hinzu (z. B. twig.extension, aber Ihr eigenes ), sodass Sie so etwas wie eine TaskChain haben, die alle Aufgaben kennt.

Zum Ausführen von erstellen Sie einen Konsolenbefehl , der den Zeitplan aus der Datenbank abruft, die TaskChain lädt und die Tasks ausführt. Dieser Konsolenbefehl kann einfach von einem Cronjob aus aufgerufen werden, ohne ihn dem Web auszusetzen. Tatsächlich rufen Sie diesen Befehl über die PHP-CLI auf und nicht über einen Browser. Das Standard-Zeitlimit ist unbegrenzt. Es sollten keine Controller für die Ausführung beteiligt sein.

Dies sollte alles in einem zusätzlichen TaskBundle organisiert werden.

16
Emii Khaos

Sie können diesen Blog verwenden, um das zu tun, was Sie wollen. Sie können dann cron oder ein anderes Programm verwenden, um die Aktion auszulösen.

In Summe:

Zunächst müssen Sie einen symfony-Befehl erstellen, der die gewünschte Funktionalität ausführt. Erstellen Sie dazu einen Ordner mit dem Namen "Command" in unserem Bundle auf derselben Ebene wie "Controller or Resources" und geben Sie einen Namen in unsere Klasse ein. Der Name muss mit "Command" enden, sonst funktioniert es nicht. Nennen wir es "MyCommand".

    <?php
    namespace Devvness\DevvnessBundle\Command;

    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Output\OutputInterface;

    class MyCommand extends ContainerAwareCommand
    {


 protected function configure()
    {
        $this->setName('devvness:my_command')
            ->setDescription('Descripción de lo que hace el comando')
            ->addArgument('my_argument', InputArgument::OPTIONAL, 'Explicamos el significado del argumento');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $em = $this->getContainer()->get('doctrine')->getManager();
        // Hacemos lo que sea
        $output->writeln('Hola mundo');
        $em->flush();
    }
}

Dann können Sie es aufrufen, indem Sie auf cmd oder console ausführen:

php app/console devness:mycommand 

oder

php app/console devness:mycommand --my_argument=valor

Anschließend müssen Sie die Aufgabe mit cron für Unix oder ähnlichem planen, indem Sie die cron-Datei bearbeiten

* * * * * php /root/absolute/for/symfony/project/app/console devness:mycommand --myargument=valor
4
Rodol Velasco

Ich hatte sehr ähnliche Bedürfnisse (deshalb habe ich dieses alte Thema gefunden), als ich an einer Anwendung mit vielen zu verwaltenden Befehlen arbeitete.

Endlich habe ich mein eigenes Paket erstellt, um die Ausführung und das Einreihen von mehreren Symfony-Befehlen (geplante Aufgaben, die über Doctrine gespeichert werden) zu verwalten.

Hier ist das Git-Repository: CommandSchedulerBundle

Ich hoffe es hilft jemandem.

Freundliche Grüße

3
n3k

Versuchen SieJmsJobQueue( Dokumentation ), die Folgendes verarbeiten kann:

  • Listenpunkt
  • Ausführen von Symfony-Konsolenbefehlen
  • Lesen von Jobs aus der Datenbank,
  • Arbeit planen,
  • Warteschlangengröße,
  • Mehrere Warteschlangen
  • Jobabhängigkeit (Verkettungslogik),
  • Webseite zur Echtzeitüberwachung und -filterung,
  • Befehlsausgabe im Jobdetail (Webseite),
  • Befehlsstatistik.
0
Takman