12

当达到最大执行时间并为用户提供更好的消息时,PHP 中有没有办法捕获致命错误?

4

4 回答 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 回答