Cronjobs in Symfony

In Symfony gibt es eine Möglichkeit eigene Commands zu erstellen. Diese funktionieren wie die Standard-Commands (z.B. php bin/console cache:clear), können dabei jegliche Funktion erfüllen und einen beliebigen Namen tragen. Sie eignen sich auch am besten für Cronjobs, es gibt nur leider ein Problem: Kein Befehl der Form php bin/console my:command funktioniert im „productive Environment (--env=prod)“…

Um dies zu umgehen muss man seine eigenen Console schreiben.
Für einfache Commands reichen simple Applications (use Symfony\Component\Console\Application;). Benutzt das Command das Container-Environment (extends ContainerAwareCommand) muss man eine andere Application verwenden, die einen AppKernel nachnutzen kann (use Symfony\Bundle\FrameworkBundle\Console\Application;). Damit lassen sich aber leider keine einzelnen Befehle registrieren, standardmäßig werden einfach alle angezeigt.

#!/usr/bin/env php
<?php
 
require __DIR__ . '/../vendor/autoload.php';
 
use Symfony\Bundle\FrameworkBundle\Console\Application;
 
// remove execution time
set_time_limit(0);
 
// create a kernel for the application
$kernel = new AppKernel('prod', false);
 
/**
 * Register a console command as php file
 * reason: you cannot execute "php bin/console ..." in prod environment
 * for this, the class is simple called directly, but fired in an application
 */
 
$application = new Application($kernel);
$application->run();

Über Patrick Blawert 4 Artikel
Seit 2016 Entwickler bei der VCAT und im Speziellen mit Symfony unterwegs

2 Kommentare

  1. Pardon, aber das stimmt nicht ganz. 😉
    Man kann durchaus das Environment auch bei Cronjobs mit angeben, indem man das bereits erwähnte `–env=prod` dem Command mitgibt. Es gibt keinen Grund, ein eigenes Consolescript dafür anzulegen.

    • Hallo Lukas,

      Recht hast du! Das hatte damals nur leider nicht so ganz funktioniert auf unseren Servern. Wir wussten damals noch nicht, dass das `EXPORT SYMFONY_ENV=prod` zwingend nötig war. Mal funktioniertes es, mal nicht, also haben wir nach anderen Lösungen geforscht. In diesem Fall war der zusätzliche AppKernel eine einfache Lösung.

      Der Beitrag ist nun auch schon etwas älter. Vielleicht nehmen wir deinen Kommentar mal als Anstoß, hier etwas zu verbessern! 😉

      Grüße
      Patrick

Kommentar hinterlassen

E-Mail Adresse wird nicht veröffentlicht.


*