在PHP中,当出现致命错误时,有没有一种方法使代码继续执行而不是退出呢?例如,我遇到了超时致命错误,我希望无论何时出现此类错误都可以跳过此任务并继续执行其他任务。但是,在这种情况下脚本会退出。
在PHP中,当出现致命错误时,有没有一种方法使代码继续执行而不是退出呢?例如,我遇到了超时致命错误,我希望无论何时出现此类错误都可以跳过此任务并继续执行其他任务。但是,在这种情况下脚本会退出。
使用输出缓冲的方法可以记录某些致命错误,但在发生致命错误后无法继续执行脚本 - 这就是它被称为致命的原因!
如果您的脚本因超时而停止,请使用set_time_limit()
函数来为其提供更多执行时间。
max_execution_time
相关的致命错误,默认情况下为30秒,那么您肯定正在做一些需要很长时间的事情:用户可能不会等待那么长时间来获取页面。max_execution_time
设置另一个(更大的)值。有两种方法可以做到这一点:php -c phpcli.ini myscript.php
php -d max_execution_time=60 myscript.php
function fatalErrorHandler()
{
$lastError = error_get_last();
if (isset($lastError["type"]) && $lastError["type"]==E_ERROR) {
// do something with the fatal error
}
}
...
register_shutdown_function('fatalErrorHandler');
几点需要注意:
我能给你的最简单的答案就是这个函数:http://php.net/manual/en/function.pcntl-fork.php
更详细地说,你可以做到以下几点:
例如,这是我在作业队列中会做的事情之一:
<?php
// ... load stuff regarding the job queue
while ($job = $queue->getJob()) {
$pid = pcntl_fork();
switch ($pid) {
case -1:
echo "Fork failed";
break;
case 0:
// do your stuff here
echo "Child finished working";
break;
default:
echo "Waiting for child...";
pcntl_wait($status);
// check the status using other pcntl* functions if you want
break;
}
}
这取决于具体的错误类型。您可以通过创建自己的错误处理程序来捕获错误。请参阅set_error_handler()上的文档,但并非所有类型的错误都可以被捕获。查看您收到的超时错误并查看其类型。如果它是E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR或E_COMPILE_WARNING之一,则无法使用错误处理程序捕获它。如果是其他类型,则可以使用错误处理程序捕获它并简单地返回。
function blabla()
{
return "yes";
}
要使其在25秒内未执行则返回无。