PHP register_shutdown_function函数的深入解析


Posted in PHP onJune 03, 2013

脚本时常死掉,而且并不总是那么好看. 我们可不想给用户显示一个致命错误,又或者一个空白页(在display_errors设为off的情况下) . PHP中有一个叫做  register_shutdown_function 的函数,可以让我们设置一个当执行关闭时可以被调用的另一个函数.也就是说当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会 被调用.所以,我们可以使用在脚本开始处设置一个变量为false,然后在脚本末尾将之设置为true的方法,让PHP关闭回调函数检查脚本完成与否. 如果我们的变量仍旧是false,我们就知道脚本的最后一行没有执行,因此它肯定在程序执行到某处死掉了.我准备了一个非常基本的例子,可以演示在一个致 命错误需要显示时,你应该怎么给用户一些合适的反馈.你可以通过关闭致命错误的显示(译注:可以设置display_errors和 error_reporting),让例子看起来好看些.

<?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;
?>

正如你所看到,如果关闭回调函数运行时,clean变量没有被设为true,shutdown_func函数将会打印出一些东西.这个东西可以包装成一个类(不使用全局变量).
PHP提供register_shutdown_function()这个函数,能够在脚本终止前回调注册的函数,也就是当 PHP 程序执行完成后执行的函数。
register_shutdown_function 执行机制是:PHP把要调用的函数调入内存。当页面所有PHP语句都执行完成时,再调用此 函数。注意,在这个时候从内存中调用,不是从PHP页面中调用,所以上面的例子不能使用相对路径,因为PHP已经当原来的页面不存在了。就没有什么相对路 径可言。
注意:register_shutdown_function 是指在执行完所有PHP语句后再调用函数,不要理解成客户端关闭流浏览器页面时调用函数。
可以这样理解调用条件:
1、当页面被用户强制停止时
2、当程序代码运行超时时
3、当PHP代码执行完成时,代码执行存在异常和错误、警告
PHP 相关文章推荐
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
php使用glob函数快速查询指定目录文件的方法
Nov 15 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
基于PHP如何把汉字转化为拼音
Dec 11 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
PHP实现无限分类的实现方法
Nov 14 PHP
PHP实现的折半查询算法示例
Oct 09 PHP
详解php语言最牛掰的Laravel框架
Nov 20 PHP
PHP 文件写入和读取操作实例详解【必看篇】
Nov 04 PHP
PHP实现微信提现功能(微信商城)
Nov 21 PHP
深入PHP与浏览器缓存的分析
Jun 03 #PHP
PHP判断图片格式的七种方法小结
Jun 03 #PHP
基于session_unset与session_destroy的区别详解
Jun 03 #PHP
PHP批量采集下载美女图片的实现代码
Jun 03 #PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 #PHP
解析CI即CodeIgniter框架在Nginx下的重写规则
Jun 03 #PHP
深入php函数file_get_contents超时处理的方法详解
Jun 03 #PHP
You might like
PHP 写文本日志实现代码
2010/05/18 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
JavaScript进制转换实现方法解析
2020/01/18 Javascript
详解javascript void(0)
2020/07/13 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
用Python生成器实现微线程编程的教程
2015/04/13 Python
pycharm debug功能实现跳到循环末尾的方法
2018/11/29 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
携程旅行网:中国领先的在线旅行服务公司
2017/02/17 全球购物
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
维也纳通行证:Vienna PASS
2019/07/18 全球购物
写自荐信的七个技巧
2013/10/15 职场文书
如何写一份好的自荐信
2014/01/02 职场文书
兴趣小组活动总结
2014/05/05 职场文书
劳模先进事迹材料
2014/12/24 职场文书
求职自我评价范文
2015/03/09 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis
python垃圾回收机制原理分析
2022/04/13 Python