PHP是否有办法在达到最大执行时间时捕获致命错误并为用户提供更好的消息?
答案 0 :(得分:9)
在这里阅读前两个答案后,我不得不自己测试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的错误输出。无论如何,这是生产现场的最佳实践。
答案 1 :(得分:3)
我的原始答案不起作用,因为您无法发现致命错误。如果您想要阅读它,请查看修订历史记录。
我唯一的猜测是你可以使用register_shutdown_function
。在脚本开头设置变量,在脚本成功完成后清除它。编写一个函数来检查该变量并在其仍然设置时对其进行操作,然后使用register_shutdown_function
http://php.net/manual/en/function.register-shutdown-function.php
答案 2 :(得分:3)
尝试在执行文件并注册关闭函数后设置“完成”标志,该函数将检查是否已定义该标志
答案 3 :(得分:0)
如果无法从API级别捕获错误,那么每当发生致命错误时,PHP引擎都应该能够在hdd上转储内存,就像Windows在看到“蓝屏”时所做的那样。