外部函数退出时未调用 register_shutdown_function

Mos*_*ady 2 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');
    }
}
Run Code Online (Sandbox Code Playgroud)

工具类

class tools {
    function loadUrl($url){
        include('url.php');
        return openUrl($url);
    }
}
Run Code Online (Sandbox Code Playgroud)

网址.php

function openUrl($url){
    //use the fsockopen function
}
Run Code Online (Sandbox Code Playgroud)

这是主要文件结构,我无法更改它,所以请不要给我答案,包括更改与更改功能或结构相关的任何内容

如果由于测试类中的函数导致最大excu时间超过30秒,则问题会正常工作,但是当最大excu时间发生在on函数中时,问题就会发生,fsockopen关闭openUrl函数不会被调用

Ada*_*dam 5

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

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

因此,只要您的连接打开,脚本就不会完成,并且您的关闭函数也不会被调用,因为连接尚未完成。

如果您尝试连接的主机没有响应或响应速度很慢,则可能会出现这种情况。

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