脚本时常死掉,而且并不总是那么好看. 我们可不想给用户显示一个致命错误,又或者一个空白页(在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 程序执行完成后执行的函数。
php程序员站
例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>register_shutdown_function示例</title>
</head>
<body>
<?php
$starttime=microtime(true);
www.phperz.com
function Test(){
$starttime=microtime(true);
if(!file_exists('Test.txt')){ //判断如果文件不存在!!
$Str = fopen('Test.txt',"w+");
fwrite($Str,'我是在最后写进来的.时间:$starttime');
fclose($Str);
echo "创建完成!创建时间:$starttime";
}
else { //如果存在;
echo '文件已经存在';
}
}
register_shutdown_function('Test');
echo "程序开始:".$starttime."<br>"; phperz~com
for($i=0;$i<1000;$i++){
echo "Echo<br/>";
}
exit;
?>
</body>
</html>
register_shutdown_function的作用是指定当本页面所有脚本执行完成之后执行的函数。
<?php
function aaa() {
echo '创建文件';
if($ttt = fopen('D:/web_root/tx.txt',"w+")) //此处要用绝对路径,用相对路径即无效。原因请看后面的解释
{
fwrite($ttt,'you are write after exit');
fclose($ttt);
}
}
register_shutdown_function('aaa'); // 函数名称无需带括号,用引号包住即可。 当本页面所有语句都执行完成,或者超时时aa函数。
exit();
?>
register_shutdown_function 执行机制是:PHP把要调用的函数调入内存。当页面所有PHP语句都执行完成时,再调用此 函数。注意,在这个时候从内存中调用,不是从PHP页面中调用,所以上面的例子不能使用相对路径,因为PHP已经当原来的页面不存在了。就没有什么相对路 径可言。
注意:register_shutdown_function 是指在执行完所有PHP语句后再调用函数,不要理解成客户端关闭流浏览器页面时调用函数。
可以这样理解调用条件:
1、当页面被用户强制停止时
2、当程序代码运行超时时
3、当PHP代码执行完成时
分享到:
相关推荐
在PHP编程中,错误处理是不可或缺的一部分,尤其是在PHP 5及其后续版本中引入了面向对象的错误处理机制,包括异常处理、错误的抛出以及回调函数。这些特性使得开发者能够更加优雅地处理程序中的错误,避免程序因错误...
在这个例子中,`Timeout::execute()`函数接受一个回调函数和超时时间作为参数,如果函数执行超过指定的毫秒数,将会抛出一个`TimeoutException`异常。 值得注意的是,这个扩展可能需要与PHP的ZEND引擎进行底层交互...
为了解释这一现象,开发者可能需要深入PHP的源代码,查看当脚本终止时,PHP的执行引擎是如何处理各种注册的回调函数。这可能涉及到函数栈、事件循环以及垃圾收集等内部机制。简单来说,__destruct和register_...
至于获取错误信息,PHP内置了error_get_last()函数,它可以在回调函数内部调用,以获取最近发生的错误信息。结合register_shutdown_function,我们可以构建出一个在脚本终止时能够记录错误或进行异常处理的机制。 ...
这为处理回调函数、迭代器和事件处理提供了更多灵活性。 在错误处理方面,PHP 5.3.5引入了异常处理(Exceptions)。相比于传统的错误报告,异常处理提供了一种更加结构化的方式来处理程序中的错误,使程序在遇到...
功能:遍历数组并对每个元素应用回调函数。 示例:`array_walk($array, function(&$value) { $value = strtoupper($value); })`。 **arsort**: 对数组按值进行逆向排序并保持索引关系 功能:按照数组的值进行逆向...
线程安全是编写PHP扩展时必须考虑的问题,因为PHP脚本可能在多线程环境下执行。 2. PHP变量在内核中的实现:包括变量的类型、值、创建和存储方式。变量在内核中是以zval结构实现的,它保存了变量的类型和值。此外,...
这个函数可以接收一个回调函数,当PHP遇到错误时,会调用这个函数,而不是显示默认的错误信息。自定义错误处理函数可以接收多个参数,如错误级别、错误消息、错误文件和错误行号,帮助开发者更精确地处理错误。 ...
总结来说,PHP中的匿名函数提供了灵活的编程方式,可以作为回调函数直接在方法调用中使用,这对于数据库操作尤其有用,因为它可以简化代码逻辑,提高代码的可维护性。不过,考虑到PHP版本的更新换代和安全性,开发者...
在这个例子中,`PhpProcessManager`类负责创建和管理子进程,`start`方法接受子进程的数量,而`on`方法用于注册启动时的回调函数,这个函数将在每个子进程中执行。 总的来说,面向对象的多进程管理器是PHP进行并发...
- `assert.callback`: 断言失败时调用的回调函数。 - `assert.quiet_eval`: 如果设置为`On`,则在评估断言表达式时不会显示错误消息。 - `assert.warning`: 是否将断言失败视为警告,默认为`On`。 ### 总结 通过...
4. **事件驱动编程**:理解如何使用回调函数处理SIP事件,如连接状态改变、消息接收等。 5. **多线程/异步处理**:处理并发SIP会话时,可能需要使用PHP的多进程或多线程功能。 6. **错误处理和调试**:学习如何在PHP...
- **assert.callback**:断言失败时调用的回调函数。 - **assert.quiet_eval**:是否静默执行断言评估。 - **assert.warning**:是否将断言错误作为警告处理。 #### 安全模式配置 - **safe_mode**:控制是否启用...
`PHP` 的 `register_shutdown_function` 是一个非常实用的函数,它允许我们在脚本执行完毕或因意外错误提前结束时,调用一个预定义的回调函数。这种功能在处理异常情况,尤其是错误处理和资源清理时显得尤为重要。...
- `assert.callback=`: 断言失败时调用的回调函数。 - `assert.quiet_eval=Off`: 是否禁止显示断言失败的具体错误信息。 通过以上对`php.ini`配置文件的解读,我们可以更好地理解和调整PHP的运行环境,以满足不同的...
- `parameter`:可选参数,你可以传递额外的参数给注册的回调函数。 PHP脚本的中止可能由以下三种情况触发: 1. 脚本正常执行完毕:在这种情况下,所有注册的shutdown函数会在脚本的最后执行。 2. 使用`exit()`或...
- **回调函数**:将函数作为参数传递给另一个函数。 - **变量函数**:函数名由变量决定。 - **递归函数**:函数自身调用自身的函数。 - **文件包含**:使用`include`或`require`引入其他文件。 **4. 函数分类**...
- **`assert.callback`**:断言失败时调用的回调函数,默认为空。 - **`assert.quiet_eval`**:是否静默地评估断言表达式,默认为`Off`。 #### 六、Apache配置相关指令 对于Apache服务器,`php.ini`文件中有专门...
- **array_walk()**: 使用用户定义的回调函数遍历数组中的每个元素。 - **arsort() / asort()**: 分别对关联数组按照值进行降序和升序排序。 - **count()**: 计算数组中的元素数量或对象的属性个数。 ### 4. 文件和...