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个人网站架设连环讲(三)
Oct 09 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
Jun 02 PHP
探讨PHP调用时间格式的参数详解
Jun 06 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
Oct 16 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
PHP中绘制图像的一些函数总结
Nov 19 PHP
PHP中子类重载父类的方法【parent::方法名】
May 06 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
May 16 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
php实现二叉树中和为某一值的路径方法
Oct 14 PHP
安装docker和docker-compose实例详解
Jul 30 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
关于svn冲突的解决方法
2013/06/21 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
Yii数据库缓存实例分析
2016/03/29 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
JavaScript原生数组Array常用方法
2017/04/06 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
微信网页登录逻辑与实现方法
2019/04/29 Javascript
微信小程序template模板与component组件的区别和使用详解
2019/05/22 Javascript
让python json encode datetime类型
2010/12/28 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
python自动生成model文件过程详解
2019/11/02 Python
python 求定积分和不定积分示例
2019/11/20 Python
佳能英国官方网站:Canon UK
2017/08/08 全球购物
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
高级Java程序员面试要点
2013/08/02 面试题
财务主管自我鉴定
2014/01/17 职场文书
员工年终自我评价
2014/09/14 职场文书
戒赌保证书
2015/05/11 职场文书
保护动物的宣传语
2015/07/13 职场文书
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python