当达到最大执行时间并为用户提供更好的消息时,PHP 中有没有办法捕获致命错误?
问问题
3933 次
4 回答
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 的错误输出。无论如何,这对于生产站点来说是最佳实践。
于 2010-04-20T21:21:12.783 回答
3
我的原始答案不起作用,因为您无法捕捉到致命错误。如果您仍然想阅读它,请检查修订历史记录。
我唯一的猜测是你可以使用register_shutdown_function
. 在脚本开始时设置一个变量,脚本成功完成后清除它。编写一个函数来检查该变量并在它仍然设置时对其进行操作,然后使用register_shutdown_function
http://php.net/manual/en/function.register-shutdown-function.php
于 2010-04-20T20:46:08.663 回答
3
尝试在执行文件后设置“完成”标志并注册一个关闭函数,该函数将检查该标志是否已定义
于 2010-04-20T20:59:17.457 回答
0
如果无法从 API 级别捕获错误,PHP 引擎应该能够在发生致命错误时将内存转储到硬盘上,就像 Windows 在看到“蓝屏”时所做的那样。
于 2013-07-17T16:35:26.537 回答