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 相关文章推荐
php基础知识:类与对象(4) 范围解析操作符(::)
Dec 13 PHP
Discuz 模板语句分析及知识技巧
Aug 21 PHP
PHP的error_reporting错误级别变量对照表
Jul 08 PHP
浅谈php函数serialize()与unserialize()的使用方法
Aug 19 PHP
PHP多个文件上传到服务器实例
Oct 29 PHP
PHP使用fopen与file_get_contents读取文件实例分享
Mar 04 PHP
php+html5+ajax实现上传图片的方法
May 14 PHP
thinkPHP5.0框架URL访问方法详解
Mar 18 PHP
php使用str_replace替换多维数组的实现方法分析
Jun 15 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 PHP
php curl批处理实现可控并发异步操作示例
May 09 PHP
laravel5实现微信第三方登录功能
Dec 06 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伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
Ajax实现对静态页面的文章访问统计功能示例
2016/10/10 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
【消息提示组件】,兼容IE6/7&amp;&amp;FF2
2007/09/04 Javascript
javascript add event remove event
2008/04/07 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
jquery 多行文本框(textarea)高度变化
2013/07/03 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
jQuery实现ToolTip元素定位显示功能示例
2016/11/23 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python列表计数及插入实例
2014/12/17 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
基于python3实现socket文件传输和校验
2018/07/28 Python
python实现推箱子游戏
2020/03/25 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
html5菜单折纸效果
2014/04/22 HTML / CSS
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang