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 相关文章推荐
批量修改RAR文件注释的php代码
Nov 20 PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 PHP
php创建多级目录的方法
Mar 24 PHP
php对数组内元素进行随机调换的方法
May 12 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
Jan 11 PHP
10个值得深思的PHP面试题
Nov 14 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
php strftime函数获取日期时间(switch用法)
May 16 PHP
PHP实现二维数组中的查找算法小结
Jun 09 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 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
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
深入解析php模板技术原理【一】
2008/01/10 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
JavaScript 变量命名规则
2009/09/23 Javascript
JS学习之一个简易的日历控件
2010/03/24 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
Vue-Router的使用方法
2018/09/05 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
Vue中computed及watch区别实例解析
2020/08/01 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
Python使用type关键字创建类步骤详解
2019/07/23 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
志愿者服务感言
2014/02/27 职场文书
文化活动实施方案
2014/03/28 职场文书
安全负责人任命书
2014/06/06 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python