Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828364
  • 博文数量: 190
  • 博客积分: 2991
  • 博客等级: 少校
  • 技术积分: 2400
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 18:11
文章分类

全部博文(190)

文章存档

2015年(3)

2014年(1)

2013年(65)

2012年(121)

我的朋友

分类: C/C++

2013-02-11 16:55:25

今天发现php中,如果要记录fatal error的时候,可以实用一个不错的函数,
叫register_shutdown_function,小结如下:

  register_shutdown_function可以让我们设置一个当执行关闭时可以被调用的另一个函数.也就是说当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会被调用.所以,我们可以使用在脚本开始处设置一个变量为false,然后在脚本末尾将之设置为true的方法,让PHP关闭回调函数检查脚本完成与否. 如果我们的变量仍旧是false,我们就知道脚本的最后一行没有执行,因此它肯定在程序执行到某处死掉了;
   例子如下:


Java代码 
1. 
2.?php  
3.$clean = false;  
4.function shutdown_func(){  
5. global $clean;  
6. if (!$clean){  
7.  die("not a clean shutdown");  
8. }  
9. return false;  
10.}  
11. 
12.register_shutdown_function("shutdown_func");  
13. 
14.$a = 1;  
15.$a = new FooClass(); // 将因为致命错误而失败  
16.$clean = true;  
17. 
18.?> 

?php
$clean = false;
function shutdown_func(){
 global $clean;
 if (!$clean){
  die("not a clean shutdown");
 }
 return false;
}

register_shutdown_function("shutdown_func");

$a = 1;
$a = new FooClass(); // 将因为致命错误而失败
$clean = true;

?>


再来一个记录fatal error的例子

Java代码 
1.function catch_fatal_error()  
2.{  
3.   
4.  $last_error =  error_get_last();  
5.    
6.  // 检查是否属于fatal_error  
7.  if(isset($last_error['type']) &&$last_error['type']==E_ERROR)  
8.  {    
9.    //相关的处理  
10.  }  
11. 
12.}  
13.register_shutdown_function('catch_fatal_error'); 
function catch_fatal_error()
{
 
  $last_error =  error_get_last();
 
  // 检查是否属于fatal_error
  if(isset($last_error['type']) &&$last_error['type']==E_ERROR)
  { 
    //相关的处理
  }

}
register_shutdown_function('catch_fatal_error');


  注意的是;
1,register_shutdown_function()函数可重复调用,但执行的顺序与注册的顺序相同
2,如果在调用register_shutdown_function()函数之前有exit()函数调用,register_shutdown_function()函数将不能执行
3,PHP4后支持注册函数参数传递
4,在某些服务端,如Apache,当前目录在register_shutdown_function()函数中能够改变
5,register_shutdown_function()函数执行在headers发送之后

原文链接地址:

阅读(1075) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~