私は、データベースからデータの塊を取得し、それを処理し、さらにデータがあるかどうかを調べるPHPスクリプトを持っています。このプロセスは無期限に実行され、一度に1つのサーバー上で複数のプロセスを実行します。問題は、いくつかの時間後に、何かが実行を停止するプロセスを引き起こしていると私はそれをデバッグし、原因を特定することができていないPHPスクリプト終了のソースを見つけるベストプラクティス
<?php
while($shouldStillRun)
{
// do stuff
}
logThatWeExitedLoop();
?>
:
はそれはのようになります。ここで
は、私がこれまでの情報を取得するために使用しているものです:
- はerror_logに - すべてのエラーをログが、エラーはエラー・ログに表示されません。
- register_shutdown_function - カスタムシャットダウン機能を登録しました。これは、プロセスがサーバーによって殺されていないことを知っているので、終了することが許可されているので、呼び出されます。 (あるいは、少なくとも私はこれが呼び出される場合であると仮定?)
- debug_backtraceは - 私のカスタムシャットダウン機能でdebug_backtrace()をログに記録しました。これは1つのコールしか表示せず、私のカスタムシャットダウン機能です。
- スクリプトの最後に到達した場合のログ - ループ外では、スクリプトがループを終了したことを記録する機能があります(したがって、通常はソースファイルの最後に到達します)。スクリプトがランダムに死んだときには、これを記録していないので、何が殺されても処理の途中で殺されます。
原因を見つけるために他にどのようなデバッグ方法をお勧めしますか?
注:これは、これらのスクリプトでは無効になっているmax_execution_timeの問題ではありません。殺されるまでの時間は矛盾しています。それは死ぬ前に10秒または12時間実行することができます。
更新/ソリューション:ご提案ありがとうございました。出力を記録することで、MySqlクエリが失敗したときにスクリプトがdie()に設定されていることがわかりました。 D'oh。 mysqlエラーを記録して終了するように更新しました。それは魅力のように今働いている!
http://www.php.net/manual/en/features.connection-handling.phpには、「タイマーが切れると、スクリプトは中止され、上記のクライアントの切断の場合と同様に、シャットダウン機能が有効になっていればそれが登録されると登録されます。あなたのステートメント「これは呼び出されるので、プロセスがサーバーによって強制終了されていないことを知っています」が間違っている可能性があります。 –
あなたが指摘したように、shutdown_backtraceはシャットダウン機能では役に立たないのです。シャットダウン機能には、トリガされたものとは別のコールスタックが存在するからです。 – Piskvor