web-dev-qa-db-ja.com

Laravelキューが「強制終了」される

大きなデータセットをジョブに送信しているときに、キューワーカーが突然終了することがあります。

// $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行あります-正常に機能します
  • 2番目の例では、$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に設定されています。

キューが突然終了するのはなぜですか?

9
PeterInvincible

タイムアウトを指定して試すことができます。たとえばphp artisan queue:work --timeout = 120

デフォルトでは、タイムアウトは60秒なので、上記のように強制的にタイムアウトを上書きします

7
Smruti Ranjan

これは私のために働きました:

私には監督職がありました:

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ダッシュボードで[権限のリセット]ボタンをクリックしました。

0
Ryan

これはあなたが探しているものではないことを知っています。しかし、私は同じ問題を抱えており、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
    
0
Mhmd

2つのオプションがあります。メモリ不足または実行時間超過。

$ dmesg | grep phpをお試しくださいこれにより、詳細が表示されます

Php.iniファイルのmax_execution_timememory_limitを増やします。

0
Owais Alam