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 相关文章推荐
BBS(php &amp; mysql)完整版(一)
Oct 09 PHP
E路文章系统PHP
Dec 11 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
Apr 12 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
Jun 03 PHP
php递归删除目录下的文件但保留的实例分享
May 10 PHP
两种设置php载入页面时编码的方法
Jul 29 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
PHP5.4起内置web服务器使用方法
Aug 09 PHP
Yii2框架类自动加载机制实例分析
May 02 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
Aug 10 PHP
php屏蔽错误及提示的方法
May 10 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目录导航文件代码
2006/10/09 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
ie 调试javascript的工具
2009/04/29 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
2010/08/30 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
javascript self对象使用详解
2016/10/18 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
python实现给微信公众号发送消息的方法
2017/06/30 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
python二进制文件的转译详解
2019/07/03 Python
python中doctest库实例用法
2020/12/31 Python
英国的屈臣氏:Boots博姿
2017/12/23 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
珠宝店促销方案
2014/03/21 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书
校园之声广播稿
2015/08/18 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
教你怎么用Python实现多路径迷宫
2021/04/29 Python
详解nodejs内置模块
2021/05/06 NodeJs
基于angular实现树形二级表格
2021/10/16 Javascript