register_shutdown_function函数详解--脚本退出时执行回调函数

  register_shutdown_function — Register a function for execution on shutdown。
  ps:Registers a callback to be executed after script execution finishes or exit() is called.

1.脚本时常死掉,而且并不总是那么好看。我们可不想给用户显示一个致命错误,又或者一个空白页(在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;
?>

  2.PHP提供register_shutdown_function()这个函数,能够在脚本终止前回调注册的函数,也就是当 PHP 程序执行完成后执行的函数。

<?php
$starttime = microtime(true);
function Test()
{
    $starttime = microtime(true);
    if(!file_exists(‘test.txt‘)){
        $Str = fopen(‘test.txt‘,"w+"); //此处竟然把文件写到apache的路径下了
        fwrite($Str,"我是在最后写进来的,时间:$starttime");
        fclose($Str);
        echo "创建完成!创建时间:$starttime";
    }
    else
    {
        echo ‘文件已经存在‘;
    }
}
register_shutdown_function(‘Test‘);
echo "程序开始:".$starttime."<br>";
for($i=0;$i<1000;$i++){
    echo "Echo<br/>";
}
exit;
?>

  3.register_shutdown_function执行机制是:PHP把要调用的函数调入内存。当页面所有PHP语句都执行完成时,再调用此 函数。注意,在这个时候从内存中调用,不是从PHP页面中调用,所以上面的例子不能使用相对路径,因为PHP已经当原来的页面不存在了。就默认为当前路径是apache的路径(猜想的,可以用getcwd()测试,具体测试看手册)。

<?php
function test()
{
    echo ‘创建文件‘;
    //此处要用绝对路径,用相对路径即无效。原因请看后面的解释
    if($handle = fopen(‘D:/tx.txt‘,"w+"))
    {
        fwrite($handle, ‘you are write after exit‘);
        fclose($handle);
    }
}
//函数名称无需带括号,用引号包住即可; 当本页面所有语句都执行完成或者超时执行test函数。
register_shutdown_function(‘test‘);
exit();
?>

注意:register_shutdown_function是指在执行完所有PHP语句后再调用函数,不要理解成客户端关闭浏览器页面时调用函数。
  可以这样理解调用条件:
  1、当页面被用户强制停止时;
  2、当程序代码运行超时时;
  3、当PHP代码执行完成时.

register_shutdown_function函数详解--脚本退出时执行回调函数

时间: 2024-10-14 07:30:27

register_shutdown_function函数详解--脚本退出时执行回调函数的相关文章

C#学习笔记--详解委托,事件与回调函数

.Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等.“protected void Page_Load(object sender, EventArgs e)”这段代码相信没有人不熟悉的.细心一点一定会发现,非常多的事件方法都是带了“object sender, EventArgs e”这两个参数.这是不是和委托非常相似呢? 一.委托(有些书中也称为委派) 委托是什么呢?这个名字的意思已

DB2常用函数详解(一):字符串函数

VALUE函数 语法:VALUE(EXPRESSION1,EXPRESSION2) VALUE函数是用返回一个非空的值,当其第一个参数非空,直接返回该参数的值,如果第一个参数为空,则返回第一个参数的值. eg: --表示如果T1.ID为空,则返回空串,如果T1.ID不为空,则返回T1.ID. SELECT VALUE(ID,'') FROM T1 COALESCE函数 语法:COALESCE(ARG1,ARG2...) COALESCE返回参数集中第一个非null参数.用法类似于VALUE函数.

php缓存技术——memcache常用函数详解

php缓存技术——memcache常用函数详解 2016-04-07 aileen PHP编程 Memcache函数库是在PECL(PHP Extension Community Library)中,主要作用是搭建大容量的内存数据的临时存放区域,在分布式的时候作用体现的非常明显,否则不建议使用. memcache 函数所有的方法列表如下: 参考http://www.php.net/manual/zh/function.Memcache-add.php Memcache::add - 添加一个值,

ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-04 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的描述 加载和动态链接 从编译/链接和运行的角度看,应用程序和库程序的连接有两种方式. 一种是固定的.静态的连接,就是把需要用到的库函数的目标代码(二进制)代码从程序库中抽取出来,链接进应用软件的目标映像中: 另一种是动态链接,是指库函数的代码并不进入应用软件的目标映像,应用软件在编译/链接阶段并

linux中fork()函数详解[zz]

转载自:http://www.cnblogs.com/york-hust/archive/2012/11/23/2784534.html 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有

fork( )函数详解

 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己. 我们来看一个例子: /* *  fork_test.c *  version 1

fork()函数详解

linux中fork()函数详解(原创!!实例讲解) (转载)  一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己. 我们来看一个例子

tcp_recvmsg 函数详解

看了很多网上关于tcp_recvmsg的文章,感觉解释的不太到位,或者很多都是空口说白话,昨天分析了一下午tcp_recvmsg,感觉了解了十之八九,现在贴出来和大家分享一下. 需要背景:了解tcp三个接收队列  prequeue,backlog,receive的各自用处. /* * This routine copies from a sock struct into the user buffer. * * Technical note: in 2.3 we work on _locked_

可变参数函数详解

可变参数函数又称参数个数可变函数(本文也简称变参函数),即函数参数数目可变.原型声明格式为: type VarArgFunc(type FixedArg1, type FixedArg2, -); 其中,参数可分为两部分:数目确定的固定参数和数目可变的可选参数.函数至少需要一个固定参数,其声明与普通函数参数相同:可选参数由于数目不定(0个或以上),声明时用"-"表示("-"用作参数占位符).固定参数和可选参数共同构成可变参数函数的参数列表. 由于参数数目不定,使用可