php スクリプトが cron からタイムアウトまで実行された後にこの問題に気付きましたが、コマンド ラインから手動で実行した場合は問題ありませんでした。(PHP では、デフォルトで CLI の max_execution_time は 0 です)
そこで、次のような単純な cron を実行しようとしました。
50 8 * * * php -q /tmp/phpinfo.php > /tmp/phpinfo
スクリプトは phpinfo() を呼び出すだけです。
驚いたことに、それは phpinfo を html 形式で書き出しており、CLI として実行されていないことが示唆されました。出力の max_execution_time は 30 でした。
コマンドラインから手動でスクリプトを実行する
php -q /tmp/phpinfo.php | less
PHP 情報をテキスト形式で書き出したところ、出力の max_execution_time は 0 でした。
どこかに設定の問題があるに違いないことはわかっていますが、どこに問題があるのか わかりませんでした。これは、私が完全に制御できる運用サーバーで発生しています。開発マシンで cron から同じスクリプトを実行すると、問題なく動作しました。
違いのまとめはこちら
function | CLI | cron |
php_sapi_name | cli | cgi-fcgi |
php_ini_loaded_file | /usr/local/lib/php.ini | /usr/local/lib/php.ini |