zoukankan      html  css  js  c++  java
  • 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代码执行完成时.

  • 相关阅读:
    我喜欢的电影
    QObject
    python-类
    pycharm活动模板
    pyqt5模块介绍
    第九章第四节 流体压强与流速的关系
    开源的推荐系统
    VNote: 一个舒适的Markdown笔记软件
    jira项目管理平台搭建
    Win10环境下,告别MarkdownPad,用Notepad++搭建编写md文档的环境
  • 原文地址:https://www.cnblogs.com/thinksasa/p/3909483.html
Copyright © 2011-2022 走看看