最大実行時間に達したときに致命的なエラーをトラップし、ユーザーにより良いメッセージを与える方法は PHP にありますか?
4 に答える
ここで最初の 2 つの回答を読んだ後、私は自分自身をテストする必要がregister_shutdown_function()ありました。実行できるとは思いませんでした。結局のところ、メモリがなくなったり、実行時間が経過したりした場合、ユーザー関数をどのように実行できるのでしょうか? OOM の状況でも、または実行時間が超過した場合でも、シャットダウン関数が実行されることを知って驚きました。コンセプトの証明:
メモリ制限をテストするには:
<?php
function asdf() { echo "omg\n"; }
register_shutdown_function('asdf');
ini_set('memory_limit', '1000');
$x = '';
while(true) {
$x .= 'lkajsdlfkjasldkfjlaskdfjasldkfj';
}
出力:
PHP Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9
PHP Stack trace:
PHP 1. {main}() /home/scratch.php:0
Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9
Call Stack:
0.0002 81360 1. {main}() /home/scratch.php:0
omg
実行時間をテストするには:
cat scratch.php
<?php
function asdf() { echo "omg\n"; }
register_shutdown_function('asdf');
set_time_limit(1);
while(true) {}
出力:
PHP Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7
PHP Stack trace:
PHP 1. {main}() /home/scratch.php:0
Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7
Call Stack:
0.0002 80200 1. {main}() /home/scratch.php:0
omg
PHP のエラー出力の前にメッセージを表示するには、PHP のエラー出力を完全に無効にする必要があることに注意してください。とにかく、これは本番サイトのベストプラクティスです。
ファイルの実行後に「完了」フラグを設定し、そのフラグが定義されているかどうかを確認するシャットダウン関数を登録してみてください
致命的なエラーをキャッチできないため、私の元の答えは機能しません。とにかく読みたい場合は、改訂履歴を確認してください。
My only guess is that you could use register_shutdown_function. Set a variable at the start of the script, clear it when the script has completed successfully. Write a function that checks that variable and acts on it if it's still set, then apply the function using register_shutdown_function
http://php.net/manual/en/function.register-shutdown-function.php
API レベルからエラーをトラップする方法がない場合、「ブルー スクリーン」が表示されたときに Windows が行うように、致命的なエラーが発生するたびに、PHP エンジンは hdd にメモリをダンプできるはずです。