2016-04-14 33 views
1

Laravelにジョブを書き込む方法を試しています。Laravelのキューとスケジューラの理解5.2

Laravelのドキュメントに従って、mail:queueを使用して電子メールを送信する単純なジョブを作成しました。

また、毎分スケジューラを呼び出すcronジョブが追加され、5分ごとにジョブが実行されます。

手動でコマンドキューを実行すると、すべてうまく動作します。

後でスケジューラ内でprintステートメントを追加したところ、奇妙な問題が見つかりました。

私はキューを実行するたびに:端末から聞いて、私は、スケジュール機能の中にある印刷メッセージを参照し、それは5秒ごとに印刷されます。

私の質問はキュー:listenスケジュール機能を呼び出しますか?はいの場合、スケジュールを追加する必要があるのはなぜですか:をcronジョブとして実行しますか?

私が使用したコード:

protected function schedule(Schedule $schedule){  
    error_log("inside scheduler"); 
    $schedule->call(function() { 
     dispatch(new \App\Jobs\SendEmail); 
    })->everyFiveMinutes();    
} 

これは私がターミナル上で実行コマンドがあります。私は(5秒毎)
スケジューラ中に入る

php artisan queue:listen 

出力スケジューラスケジューラ 内部
内部
...

は、誰かがここで何が起こっているかを説明できますか?

から
SendEmail.php

public function handle() { 
//do some task here 
Mail::queue("emails.send_update", [], function($message) { 
    $message->to("[email protected]"); 
    $message->subject('Status has been updated'); 
}); 
} 
+0

解決策はありますか。そして私は 'schedule()'関数が 'queue:listen'によってなぜ実行されるのかも混同しました。 –

答えて

3

キューとスケジューリングは異なるものですより良く理解するためのジョブコードを追加します。

Queues サーバーで実行するメールキューを設定できます。これは常に聞いています。メールキューに電子メールを追加すると、キュー機能はできるだけ早くメールの送信を実行します。別のスレッドでこれを行うだけです。

Scheduling これは、cronジョブを整理するためのLaravelの方法です。 Laravelは、1分ごとに実行するサーバー上の1つのcronコマンドをschedule:runと設定することを提案しています。このコマンドでは、Laravelは設定したスケジューリングスクリプトとその条件を調べ、実行する必要があるときに適切なスクリプトを実行します。

あなたのメールタスクに関しては、ジョブキューにメールを追加して、そのままにしておく必要があります。スケジューリングは必要ありません。あなたのサーバでは、キューがqueue:listenで実行されているだけです。メールがキューに追加されると、すぐに送信されます。

サーバでは、スケジューリングスクリプト(スケジューリング:スケジューラの開始を参照)のcronコマンドを設定しますが、cronがセットアップされたことを忘れることがあります。その後、特定の時間に実行される独自のスケジューリングスクリプトを作成するだけで、Laravelがあなたのために魔法を働かせます。

更新応答: あなたSendEmail.php機能では、あなたが送信されたメールのタスクを処理する必要があります。現時点では

public function handle(Mailer $mailer) 
{ 
    $mailer->send('emails.reminder', ['user' => $this->user], function ($m) { 
     // 
    }); 
} 

のようなものを、5分ごとにあなたが追加していますキューへの新しいジョブが、電子メールメッセージをキューに入れることです。したがって、効果的にメッセージを連続的にキューイングしますが、実際には実行しません。

+0

こんにちはTom。私はあなたが言ったことを実際にやっています。要件は、特定のタスクを実行してから電子メールを送信するジョブを持つことです。 5分ごとに実行する必要があります。私はまたあなたが述べたようにスケジューラを呼び出すセットアップcronジョブを持っています。すべてが説明どおりに機能します。私が理解できないことは、待ち行列とスケジューラーが異なるからです。なぜ待ち行列ですか:スケジュール関数を呼び出すのですか?私のOPでわかるように、error_logは5秒ごとにメッセージを出力します。 –

+0

私の更新された回答を参照してください – Tom

+0

私は待ち行列を聞いていません:その質問の 'schedule()'関数を実行してください。 –