2016-10-24 5 views
0

Hy! Ich habe eine Anwendung, wo ich einige E-Mails bei bestimmten Aktionen (wie Benutzererstellung usw.) senden muss. Problem ist, dass sie nicht im Hintergrund laufen, stattdessen muss ich warten, bis der Prozess abgeschlossen ist, und dann leitet es mich auf eine andere Seite um. Ich verwende database Treiber mit , Laravel 5.2. Mein Code für E-Mail, für exp nach Benutzererstellung:Laravel Queue Job funktioniert nicht im Hintergrund

$this->dispatch(new WelcomeEmail($user)); 
Artisan::call('queue:work'); 

wo WelcomeEmail der Job ist, die in der Warteschlange geschoben wird. Diese Art von Code wird an allen Stellen platziert, an denen eine E-Mail gesendet werden soll. Was ist falsch?

Antwort

3

Zuerst möchten Sie nicht Artisan::call auf "Warteschlange" -Befehle in Ihrem Dispatcher verwenden.

Sie sollten Ihr Terminal öffnen und ausführen: und Sie sollten es sein lassen.
Dann können Sie Ihre Seite besuchen, wo $ this-> Versand oder noch besser Versandmethode aufgerufen werden. Code auf dieser Seite sollte sein:
dispatch(new WelcomeEmail($user));

auf dem Produktionsserver, sollten Sie supervisord verwenden Ihre php artisan queue:listen Befehl zu überwachen, um sicherzustellen, dass es auf und läuft die ganze Zeit.

Weiterführende Literatur finden Sie unter: https://laravel.com/docs/5.2/queues

+0

Ok, aber was ist, wenn ich keine Vorgesetzten verwenden möchte? Kann ich sie in einen Cron legen? – EBuzila

+0

Ich entschied mich, mit Vorgesetzten zu arbeiten, und es funktioniert! Danke vielmals! – EBuzila

+0

Nun, du brauchst * Supervisord * nicht zu verwenden, du könntest die Daemon-Option benutzen, aber es hat einige Auswirkungen auf den Code. Ehrlich gesagt, mit Supervisord ist ein guter Anruf, und es wird Ihnen einige Kopfschmerzen ersparen. Weitere Informationen finden Sie auf dem Link, den ich zur Verfügung gestellt habe. Kein Problem, es war Vergnügen. –

0

Ich hatte ein ähnliches Problem, aber weil ein einzelner Job war, habe ich nicht ein Daemon will auch immer läuft, gibt es das Update-Code Problem, .... so löste ich den Befehl direkt von PHP ausgeführt wird, wie:

exec ('nohup php/my_folder/Handwerker Warteschlange: work --once>/dev/null 2> & & 1');

Dies wird einen Job starten und dann ausschalten, ohne das Ergebnis abzuwarten. Aber seien Sie vorsichtig bei den Laravel-Protokolldateiberechtigungen, dem o.s. Benutzer können ändern, wenn Sie unter Linux abhängig von Kontext und Konfiguration laufen.

Hoffe, dass kann jemand helfen.

+0

Sie können Code/Skript mit ctrl-k (für ganze Zeilen) oder mit dem Backtick ('' ') markieren. Hoffentlich kann jemand mir folgen, indem er mir sagt, wie man einem Backtick auf dieser Seite entkommen kann :) – zzxyz

+0

Ich bin auf meinem Telefon, eines Tages werde ich es bearbeiten, danke – Debugo