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读取IMAP邮件
Oct 09 PHP
手把手教你使用DedeCms的采集的图文教程
Mar 11 PHP
PHP 存储文本换行实现方法
Jan 05 PHP
解析php类的注册与自动加载
Jul 05 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
Nov 14 PHP
分享一段PHP制作的中文拼音首字母工具类
Dec 11 PHP
Laravel 5框架学习之Laravel入门和新建项目
Apr 07 PHP
PHP面向对象详解(三)
Dec 07 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
Jul 07 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 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
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
JS闭包原理及其使用场景解析
2020/12/03 Javascript
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
详解python实现数据归一化处理的方式:(0,1)标准化
2019/07/17 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
Python如何急速下载第三方库详解
2020/11/02 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
外国人来华邀请函
2015/01/31 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
pytorch MSELoss计算平均的实现方法
2021/05/12 Python
详解OpenCV曝光融合
2022/04/29 Python
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL