当退出在外部函数中发生时,不调用register_shutdown_function

时间:2015-12-12 13:50:24

标签: php

我有一个班级,在那个班级我有一个关机功能,注册如下

class test{
    function __construct() {
        $self = $this;
        $shutdown = function () use (&$self) {
            $self->shutdown();
        };
        register_shutdown_function($shutdown);
    }

    public function shutdown()
    {
        echo 'shutdown';
    }

    public function doThing(){
        $tools = new tools();
        $tools->loadUrl('https://google.com');
    }
}

工具类

class tools {
    function loadUrl($url){
        include('url.php');
        return openUrl($url);
    }
}

url.php

function openUrl($url){
    //use the fsockopen function
}

这是主要的文件结构,我不能改变它所以请不要给我答案包括更改任何与更改功能或结构有关的事情

问题 如果由于测试类中的函数最大激励时间超过30秒它将正常工作,但问题发生在fsockopen openUrl函数上的最大excu时间,关闭函数没有叫

1 个答案:

答案 0 :(得分:3)

您应该阅读有关流操作和最长执行时间的PHP文档说明:

  

注意:   set_time_limit()函数和配置指令max_execution_time仅影响脚本本身的执行时间。 在确定脚本的最长时间时,花在执行脚本之外的活动上的任何时间,例如使用system()的系统调用,流操作,数据库查询等都不包括在内运行。在测量时间真实的Windows上,情况并非如此。

因此,只要您的连接被打开,脚本就不会完成,您的关机功能也不会被调用,因为连接尚未完成。

如果您尝试连接的主机没有响应或答案很慢,可能就是这种情况。

如果要为fsockopen调用定义超时,则必须定义变量default_socket_timeout或使用fsockopen函数的第五个参数(http://php.net/fsockopen