かきスタンプ

福岡でフリーランスの物流系のエンジニアやってます。

Laravel : ジョブのタイムアウトを設定には、pcntl(PHPの拡張項目)を有効化する必要がある

Laravel のバージョン: 8.16.1
PHP のバージョン: 7.4.7

 
ジョブを実行する時、以下のようにタイムアウトの時間(X 秒経過するとエラー)を設定できる。

php artisan queue:listen --timeout=60

他にも、タイムアウト時間を、コードに記述する事もできる。

namespace App\Jobs;

class ProcessPodcast implements ShouldQueue
{
    /**
     * タイムアウトになる前にジョブを実行できる秒数
     *
     * @var int
     */
    public $timeout = 120;
}

優先順位としては、コードに記述した時間の方が高くなる。

例えば、「php artisan queue:listen --timeout=60」とコマンドを打っても、ソースコードでは「$timeout = 120」となっていた場合、タイムアウト時間は 120秒となる。

<Laravel 公式サイト>
https://readouble.com/laravel/8.x/ja/queues.html#cleaning-up-after-failed-jobs

が、実験したところ、ソースコードにて指定された「120」が有効とならなかった。

実はこの設定だけでは不十分で、「pcnt」という PHPの拡張項目を有効にする必要がある。
詳細は以下を参照。

# Timeout
https://laravel.com/docs/8.x/queues#timeout

The pcntl PHP extension must be installed in order to specify job timeouts.

pcntl を有効にするには、以下を参照してください。
PHP・Docker:Docker コンテナ起動の PHP にて、pcntl を有効にする方法

この設定を有効化すると、ジョブ実行のタイムアウト時間を設定する事ができます。

失敗したジョブを再実行

失敗したジョブを全て実行する場合、以下のコマンドを実行すると、失敗ジョブが再びキューに戻る。

php artisan queue:retry all

その後、「queue:work」や「queue:listen」等で、再び実行できる。

php artisan queue:listen