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 相关文章推荐
再次研究下cache_lite
Feb 14 PHP
PHP分页函数代码(简单实用型)
Dec 02 PHP
PHP设置图片文件上传大小的具体实现方法
Oct 11 PHP
php中使用sftp教程
Mar 30 PHP
3种php生成唯一id的方法
Nov 23 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
php闭包中使用use声明变量的作用域实例分析
Aug 09 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 PHP
php+websocket 实现的聊天室功能详解
May 27 PHP
PHP反射基础知识回顾
Sep 10 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各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
php fseek函数读取大文件两种方法
2016/10/12 PHP
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
javascript验证form表单数据的案例详解
2019/03/25 Javascript
element ui分页多选,翻页记忆的实例
2019/09/03 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
简述Python中的面向对象编程的概念
2015/04/27 Python
python简单文本处理的方法
2015/07/10 Python
解决Python传递中文参数的问题
2015/08/04 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
PyQT5 QTableView显示绑定数据的实例详解
2019/06/25 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
python 实现字符串下标的输出功能
2020/02/13 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
Python logging模块原理解析及应用
2020/08/13 Python
Java工程师面试集锦之Spring框架
2013/06/16 面试题
什么是网络协议
2016/04/07 面试题
期末复习计划
2015/01/19 职场文书
小学少先队活动总结
2015/05/08 职场文书
少先队工作总结2015
2015/05/13 职场文书