register_shutdown_function() 函数的学习及使用

袁志蒙 次浏览

摘要:register_shutdown_function定义:该函数是来注册一个会在PHP中止时执行的函数参数说明:register_shutdown_function ($callback, $para...

register_shutdown_function

定义:该函数是来注册一个会在PHP中止时执行的函数


参数说明:register_shutdown_function ($callback, $parameter)  


注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。

$callback:待注册的中止回调[必须]

$parameter:可以通过传入额外的参数来将参数传给中止函数[可选]


可以多次调用 register_shutdown_function() ,这些被注册的回调会按照他们注册时的顺序被依次调用。 如果你在注册的方法内部调用 exit(), 那么所有处理会被中止,并且其他注册的中止回调也不会再被调用。


PHP中止的情况有三种:

1.程序执行完成;

2.exit/die导致的中止;

3.发生致命错误中止;


例1(程序执行完成):

register_shutdown_function('test');  
function test()  
{  
    echo '这个是中止方法test的输出';  
}  
  

  
echo '结束代码<br>';

运行结果:

结束代码
这个是中止方法test的输出

例2(exit导致的中止):

register_shutdown_function('test');  
function test()  
{  
    echo '这个是中止方法test的输出';  
}  
  
exit();
  
echo '结束代码<br>';

运行结果:

这个是中止方法test的输出

例3(发生致命错误中止):

register_shutdown_function('test');  
function test()  
{  
    echo '这个是中止方法test的输出';  
}  
  
// 这里会发生致命错误  
$a = new a();  
  
echo '结束代码<br>';

运行结果:

Fatal error:  Class 'a' not found in E:\phpStudy\PHPTutorial\WWW\a.php on line 47
这个是中止方法test的输出

例4(在类中的使用):

class test {  
    public function __construct() {  
        register_shutdown_function(array($this, 'a'), 'hello');  
    }  
  
    public function a($str) {  
        echo "class test->a():" . $str;  
    }  
}  

$t = new test;

  
echo '结束代码<br>';

运行结果:

结束代码
class test->a():hello


注意,以下两种情况不会执行回调函数:

1.程序有语法错误;

2.register_shutdown_function函数前,发生了致命错误;


学以致用:

可以使用该函数可以用来捕获致命错误并且在发生致命错误后恢复流程处理!

例如要做一个消费队列,因为某条有问题的数据导致致命错误,如果这条数据不处理掉,那么整个队列都会导致瘫痪的状态,这样可以用以下方法来解决。即:如果捕获到有问题的数据导致错误,则在回调函数中将这条数据处理掉就可以了。

随机新闻

表情

共2条评论
  • 管理员

    管理员 回复 YzmCMS博客网友 :最好的办法就是记录日志,当有异常发生时,记录日志,然后就可以排查出哪里出的问题了

    2018-04-27 13:32:01 回复

  • YzmCMS博客网友

    请问所谓的处理掉异常的数据怎么处理?在里面根本就无从知道队列发生知名错误的 是哪一条,就是假设你数据里面的第10条数据产生了错误,但里面根本无从知道是第10条数据错了

    2018-04-27 11:54:40 回复