如何让php安心的死去?
你有没有想在php终止时自动执行写什么?比如说关闭数据库连接,当然,php自己是会自动关闭的。有没有想在意外出错终止时自己能记录些信息么?当然set_error_handler就是为这个准备的。
这里我来说下一个很少用的函数register_shutdown_function,既然php会在执行完代码后自动关闭打开的数据连接,而且也有专门的错误处理的,还要这个函数干啥?存在即合理,比如说自己弄个执行日志了啥的。
先说说什么情况下php会调用register_shutdown_function:
1、php代码都正常执行完毕后(包括使用exit语句退出后)
2、php执行遇到PARSE Error等终止错误后
来咯,看例子
<?php
function test() {
// 注意,在这里是用ob_start的话,php5.0前后版本有很大的差别,比如在php4中,只是用ob_start而没有使用ob_flush,那么本函数内echo的将不会有任何输出,而php5.1则正常,另外还会和ob_start中的第一个参数有所“冲突”(先后的优先顺序的问题)
//ob_start();
$f = fopen(dirname(__FILE__) . '/test.txt', 'w');
fwrite($f, date('Y-m-d H:i:s'));
fclose($f);
}
register_shutdown_function('test');
// 下面开始你可以一行行注释掉看看效果
require('file_exists');
exit();
echo('test');
?>
就上面例子中做一些说明,比如在打开文件时使用__FILE__来获取当前目录,以让test.txt写入到当前目录,如果只使用fopen('test.txt', 'w');的话,那么你就要去Web server的目录下去找了。
另外对于在更早版本的php或apache等环境下,register_shutdown_function回调的函数里执行的echo等语句是不会输出到浏览器中,所以也不推荐在回调函数中进行任何输出(哎,php就是这样的糟糕,不同版本之间的兼容性有时候有着不可思议的不一样)。
到了这里,好像说了半天这东西没啥用?不的,看例子
<?php
$error = true;
function checkerror() {
global $error;
if ($error) {
$f = fopen(dirname(__FILE__) . '/test.txt', 'a');
fwrite($f, var_export($_SERVER, true));
fclose($f);
}
}
register_shutdown_function('checkerror');
require('file_exists');
echo('test');
$error = false;
?>
这样就能自动收集到一些简单的错误信息了,特别是对于一些很难追踪(少部分发生的)错误。
转载请注明:天空巴士 - www.sky84.cn
本文链接地址:http://www.sky84.cn/index.php/article_content_id,132.html






