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的无限分类实现想法~
Jan 02 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
Aug 26 PHP
yii框架源码分析之创建controller代码
Jun 28 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
PHP错误提示的关闭方法详解
Jun 23 PHP
PHP获取文件行数的方法
Jun 10 PHP
php中define用法实例
Jul 30 PHP
php排序算法实例分析
Oct 17 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
Nov 16 PHP
PHP的mysqli_set_charset()函数讲解
Jan 23 PHP
详解PHP变量传值赋值和引用赋值变量销毁
Mar 23 PHP
对laravel的session获取与存取方法详解
Oct 08 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
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
PHP多文件上传类实例
2015/03/07 PHP
Java中final关键字详解
2015/08/10 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
js获取url参数的使用扩展实例
2007/12/29 Javascript
Jquery Ajax.ashx 高效分页实现代码
2009/10/20 Javascript
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
2015/09/10 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
详解如何使用Python编写vim插件
2017/11/28 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
python命令行工具Click快速掌握
2019/07/04 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
python数据预处理 :数据抽样解析
2020/02/24 Python
电大自我鉴定
2013/10/27 职场文书
集中整治工作方案
2014/05/01 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python
Python实现自动玩连连看的脚本分享
2022/04/04 Python