大きなデータセットをジョブに送信しているときに、キューワーカーが突然終了することがあります。
// $taskmetas is an array with other arrays, each subsequent array having 90 properties.
$this->dispatch(new ProcessExcelData($Excel_data, $taskmetas, $iteration, $storage_path));
ProcessExcelData
ジョブクラスは box/spout パッケージを使用してExcelファイルを作成します。
$taskmetas
には880行あります-正常に機能します$taskmetas
には10,000行あります-突然終了します1番目の例-小さなデータセットのキュー出力:
forge@user:~/myapp.com$ php artisan queue:work --tries=1
[2017-08-07 02:44:48] Processing: App\Jobs\ProcessExcelData
[2017-08-07 02:44:48] Processed: App\Jobs\ProcessExcelData
2番目の例-大きなデータセットのキュー出力:
forge@user:~/myapp.com$ php artisan queue:work --tries=1
[2017-08-07 03:18:47] Processing: App\Jobs\ProcessExcelData
Killed
他のエラーと同様に、エラーメッセージが表示されず、ログが空で、ジョブがfailed_jobs
テーブルに表示されません。時間制限は1時間に、メモリ制限は2GBに設定されています。
キューが突然終了するのはなぜですか?
タイムアウトを指定して試すことができます。たとえばphp artisan queue:work --timeout = 120
デフォルトでは、タイムアウトは60秒なので、上記のように強制的にタイムアウトを上書きします
これは私のために働きました:
私には監督職がありました:
Job ID, Queue, Processes, Timeout, Sleep Time, Tries, Action Job_1,
Default, 1, 60, 3, 3
https://laravel.com/docs/5.6/queues#retrying-failed-jobs 言う:
失敗したジョブをすべて削除するには、queue:flushコマンドを使用します。
php artisan queue:flush
それで、(php artisan queue:failed
を実行して失敗したジョブがあったことを確認した後)、それを行いました。
次に、スーパーバイザジョブを削除し、同様の新しいジョブを作成しましたが、タイムアウトは360秒です。
また、(Cloudwaysアプリのコントロールパネル内で)スーパーバイザジョブを再起動し、(Cloudwaysサーバーのコントロールパネル内で)スーパーバイザプロセス全体を再起動することも覚えておく必要があります。
ジョブを再度実行しようとしたところ、failed_jobs
テーブルでジョブに気づき、例外がキャッシュファイルの権限に関連していることを確認したので、アプリのCloudwaysダッシュボードで[権限のリセット]ボタンをクリックしました。
これはあなたが探しているものではないことを知っています。しかし、私は同じ問題を抱えており、OSのbcsで発生していると思います(正確な理由が見つかった場合は変更します)。
queue:listen
の代わりに
queue:work
この2つの主な違いは、ジョブごとにqueue:listen実行ジョブクラスコード(ワーカーやスーパーバイザーを再起動する必要がないため)ですが、queue:workはキャッシュシステムを使用し、queue:listenよりも非常に速く動作し、OSは実行できません。この速度を処理し、キュー接続を準備します(私の場合はRedis)
queue:listenコマンドはqueue:workを自身で実行します(これは、実行中のプロセスからhtopまたは..で確認できます)。
しかしspeedのqueue:listenコマンド、bcsをチェックするように指示する理由。 OSはこの速度で簡単に動作し、キュー接続を処理するのに問題はありません...(私の場合、もうサイレントキルはありません)
あなたが私の問題を抱えているかどうかを知るには、キュードライバーを.envから「同期」に変更して、それが再び殺されるかどうかを確認します-殺されない場合は、問題がオンであることを知ることができます使用するキュー接続の準備
メモリの問題があるかどうかを確認するには、listenメソッドまたは同期でキューを実行し、phpがそのエラーを返します。メモリを増やして、もう一度テストできます。
このコードを使用して、コードでテストするためのメモリを増やすことができます
ini_set('memory_limit', '1G');//1 GIGABYTE
2つのオプションがあります。メモリ不足または実行時間超過。
$ dmesg | grep php
をお試しくださいこれにより、詳細が表示されます
Php.iniファイルのmax_execution_time
やmemory_limit
を増やします。