PHP register_shutdown_function函数详解

转自:http://www.blogdaren.com/post-2030.html


  1. 脚本时常死掉,而且并不总是那么好看. 我们可不想给用户显示一个致命错误,又或者一个空白页(在display_errors设为off的情况下) . PHP中有一个叫做 register_shutdown_function 的函数,可以让我们设置一个当执行关闭时可以被调用的另一个函数.也就是说当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会 被调用.所以,我们可以使用在脚本开始处设置一个变量为false,然后在脚本末尾将之设置为true的方法,让PHP关闭回调函数检查脚本完成与否. 如果我们的变量仍旧是false,我们就知道脚本的最后一行没有执行,因此它肯定在程序执行到某处死掉了.我准备了一个非常基本的例子,可以演示在一个致 命错误需要显示时,你应该怎么给用户一些合适的反馈.你可以通过关闭致命错误的显示(译注:可以设置display_errors error_reporting),让例子看起来好看些.
  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. register_shutdown_function("shutdown_func");
  12. $a = 1;
  13. //将因为致命错误而失败
  14. $a = new FooClass();
  15. $clean = true;
  16. ?>
  17. 正如你所看到,如果关闭回调函数运行时,clean变量没有被设为true,shutdown_func函数将会打印出一些东西.这个东西可以包装成一个类(不使用全局变量).
  18. PHP提供register_shutdown_function()这个函数,能够在脚本终止前回调注册的函数,也就是当 PHP 程序执行完成后执行的函数。
  19. 例子:
  20. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  21. <html xmlns="http://www.w3.org/1999/xhtml">
  22. <head>
  23. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
  24. <title>register_shutdown_function示例</title>
  25. </head>
  26. <body>
  27. <?php
  28. $starttime = microtime(true);
  29. function Test()
  30. {
  31. $starttime = microtime(true);
  32. if(!file_exists('test.txt')){
  33. $Str = fopen('test.txt',"w+");
  34. fwrite($Str,"我是在最后写进来的,时间:$starttime");
  35. fclose($Str);
  36. echo "创建完成!创建时间:$starttime";
  37. }
  38. else
  39. {
  40. echo '文件已经存在';
  41. }
  42. }
  43. register_shutdown_function('Test');
  44. echo "程序开始:".$starttime."<br>";
  45. for($i=0;$i<1000;$i++){
  46. echo "Echo<br/>";
  47. }
  48. exit;
  49. ?>
  50. </body>
  51. </html>
  52. register_shutdown_function的作用是指定当本页面所有脚本执行完成之后执行的函数
  53.  
  54. <?php
  55. function test()
  56. {
  57. echo '创建文件';
  58. //此处要用绝对路径,用相对路径即无效。原因请看后面的解释
  59. if($handle = fopen('D:/web_root/tx.txt',"w+"))  
  60. {
  61. fwrite($handle, 'you are write after exit');
  62. fclose($handle);
  63. }
  64. }
  65. //函数名称无需带括号,用引号包住即可; 当本页面所有语句都执行完成或者超时执行test函数。
  66. register_shutdown_function('test');  
  67. exit();
  68. register_shutdown_function执行机制是:PHP把要调用的函数调入内存。当页面所有PHP语句都执行完成时,再调用此 函数。注意,在这个时候从内存中调用,不是从PHP页面中调用,所以上面的例子不能使用相对路径,因为PHP已经当原来的页面不存在了。就没有什么相对路 径可言。
  69. 注意:register_shutdown_function是指在执行完所有PHP语句后再调用函数,不要理解成客户端关闭流浏览器页面时调用函数。
  70. 可以这样理解调用条件:
  71. 1、当页面被用户强制停止时
  72. 2、当程序代码运行超时时
  73. 3、当PHP代码执行完成时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值