29分実行後に失敗したPHP cronジョブがあります。ログ(/var/log/php_errors.log
)に誤りがある:最大実行時間の致命的なエラーによるPHP cronジョブの早すぎる終了
[01-Mar-2012 00:32:57 UTC] PHP Fatal error: Maximum execution time of 60 seconds exceeded in /path/file.php on line 2079
のcronをトリガーcrontabエントリは次のとおりです。私の研究から
00 00 * * * /usr/bin/php /path/file.php
私はこれがためmax_execution_time
コンフィグ設定に関連しているとは思いません:
- 実際には29分18秒(つまり、エラーメッセージのような60分以上)実行されています。 the PHP docsから
- - PHPをコマンドラインから実行する場合、デフォルトの設定は0
Qです:なぜスクリプトが早期に終了していますか?
注:
スクリプトは非常に重く、DBクエリの何千もを実行しないが、私はtop
を実行していたし、CPUの負荷が高くありませんでした。
エラー・ログから行がmysql_query
呼び出しです:
$sql = "SELECT SUM(amount) FROM mytab WHERE mem = '$id' AND validto > '$now'";
$res = mysql_query($sql);
> php -v
PHP 5.3.10 (cli) (built: Feb 2 2012 17:34:38)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
with Suhosin v0.9.33, Copyright (c) 2007-2012, by SektionEins GmbH
> cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.7 (Tikanga)
更新 - スクリプトはリアルタイムの29分間実行することができますなぜ私が見つかりましたが、 PHPは引用実行時間をずっと短縮することができます。
system()、ストリーム操作、データベースクエリなどを使用したシステムコールなど、スクリプトの実行以外で発生するアクティビティに費やされる時間は、スクリプトが実行された最大時間。
(the set_time_limit() docsよりも、the max-execution-time docsでも言及されている)。これは、スクリプトの大部分が、実行時間のクロッキングを行わないdbクエリと支払いAPI呼び出しを長時間実行していたため、私にとっては関係がありました。
cronジョブはエラーとは何の関係もありません。これはPHPの純粋な問題です。メモリリークをチェックし、ループを実行した後にバグ配列の一部を解除しようとします。クエリ間に他の大きな変数を設定します。 –
また、ドキュメントには以下のことが書かれています。_最大実行時間はシステムコール、ストリーム操作などの影響を受けません。 cronによって起動されたPHP _CLI_であることを確認できますか? –
また、選択を高速化するのに適したインデックスがあることを確認します。 *** mem ***と*** validto ***のインデックスを持っていますか? –