Laravelにはタスクスケジュールという機能があります。cronと同じような機能ですが、cronよりも直感的に設定することができます。このLaravelのタスクスケジュールが、なぜかあるCentOS7環境では正常に動作しませんでした。具体的には、10分ごとに実行されるはずの複数のタスクがまったく実行されません。
|
Laravel |
疑ったこと
- cronのバージョンが違うのでは
- runInBackgroundがまずいのかも
調べた結果、cronのバージョンは特に問題なさそうでした。runInBackgroundが原因かどうかを確かめるために、Kernel.phpで設定しているコマンドを、crontabに直接書いてみました。
Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->command('run:a')
->everyTenMinutes()
->runInBackground();
$schedule->command('run:b')
->everyTenMinutes()
->runInBackground();
}
crontab変更前
* * * * * php /path/to/laravel/artisan schedule:run >> /dev/null 2>&1
crontab変更後
# run:a (everyTenMinutes offset 5)
5-55/10 * * * * /usr/bin/php /path/to/laravel/artisan run:a >> /tmp/cron.log 2>&1
# run:b (everyTenMinutes)
*/10 * * * * /usr/bin/php /path/to/laravel/artisan run:b >> /tmp/cron.log 2>&1
結果
/tmp/cron.logに出力したログを見ると次のようなエラーが。
Mon Jan 13 19:xx:xx xxxx (26938): Fatal Error Unable to allocate shared memory segment of 134217728 bytes: mmap: Cannot allocate memory (12)
run:a called at 20xx-01-13 19:xx:xx
なんとLaravelはぜんせん関係ありませんでした。どうもメモリが足りないようです。2つのタスクの起動タイミングを5分ずらすとエラーが減少する理由もこれで納得。
環境の変更
php-opcacheを導入したばかりだったので、原因はおそらくphp-opcacheと考えて、メモリの設定を128MBから64MBに変更すると、エラーがなくなりました。
/etc/php.d/10-opcache.ini
; The OPcache shared memory storage size.
;opcache.memory_consumption=128
opcache.memory_consumption=64
php-opcacheの設定変更は、
リセット処理で反映されるようです。
php -r "var_dump(opcache_reset());"
原因がわかるまで、すごく時間がかかった・・