• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Integration Resque (PHPResque) mit ZF2

nick3331

New member
Hi,

vermutlich haben einige von euch schon verschiedene Lösungsansätze für asynchrone Jobs gebraucht/benutzt/darüber gehört. Ich war neulich auch an einem solchen Punkt und habe mir für dessen Lösung PHPResque ausgesucht. PHPResque ist ein auf Resque (Python-Programm) basiertes Framework um Jobs in den Hintergrund auszulagern. Dafür wird einem Job eine Queue (die den Job-Typ identifiziert und die zum Beispiel zur Priorisierung benutzt werden kann), eine Klasse und Parameter übergeben. Die Klasse, die man angibt wird dann von der Hintergrund-Job-Verwaltung initialisiert, die Parameter werden durch ein dynamisch generiertes Feld "args" gesetzt und die Methode "perform" wird ausgeführt.

Nun ist es aber so, dass die Jobs häufig viele der Abhängigkeiten der gesamten Applikation teilen. Dadurch ist es schwer zu entscheiden wie man einen solchen Job definiert (welche Klasse, etc). Ich habe dazu einen Lösungsansatz, der leider nicht ganzen meinen Bedürfnissen entspricht:
Ich habe eine Datei resque.php in den Ordner public gesteckt (vermutlich wäre sie woanders besser aufgehoben), die etwa so aussieht:
PHP:
chdir(dirname(__DIR__));
require 'init_autoloader.php';
/**
 * Class Application
 * @property mixed args 
 */
class Application {
        public function perform() {
                global $argc,$argv;
                $argv = explode(' ',$this->args['command']);
                array_unshift($argv,'resque.php');
                $argc = count($argv)+1;
                $_SERVER['argv'] = $argv;
                $_SERVER['argc'] = $argc;
                $application = \Zend\Mvc\Application::init(require 'config/application.config.php');
                $application->bootstrap();
                $application->run();
        }
}
Sie orientiert sich im Aufbau an der index.php der Skeleton-Application des ZF2.
Um jetzt einen Job für den Hintergrund vorzubereiten führe ich folgenden Befehl aus:
PHP:
Resque::enqueue($queueName, "Application", array('command' => $consoleCommand));
Die so ausgeführten Befehle müssen über eine console-route erreichbar sein.

So viel zu der bisherigen (funktionierenden) Lösung. Jetzt mein Problem:
Da ich sehr viele sehr kleine Jobs habe, kommt es zu einem deutlichen Overhead durch den Initialisierungs-Prozess. Hierfür hatte ich die Hoffnung wenigstens einen der Befehle
PHP:
$application = \Zend\Mvc\Application::init(require 'config/application.config.php');
$application->bootstrap();
schon vor dem fork des PHPResque-Managers auszuführen. Es scheint aber so, als ob der Router die Parameter argv (und evtl. argc, dürfte aber nicht so wichtig sein) schon während dem init ausführen würde. Dadurch kann die Application erst initialisiert werden, wenn man die Parameter kennt, muss also auch für jeden Job einzeln gemacht werden. Das ist unschön. Natürlich gibt es noch andere Möglichkeiten die Initialisierung der Application generell zu beschleunigen, aber vielleicht kennt ja jemand eine naheliegende Lösung um das beschriebene Verhalten zu erreichen.

Generell bin ich auch für Lösungen der grundsätzlichen Problemstellung "asynchrone Jobs ohne auf das Framework zu verzichten" offen.

Viele Grüße

Nick
 
Oben