浏览器退出时不会退出PHP脚本

如果客户端关闭浏览器(因此连接到服务器),为什么这个虚拟脚本会继续运行事件?

while ( true )
{
    sleep( 1 );
    file_put_contents( '/tmp/foo' , "I'm alive ".getmypid()."\n" , FILE_APPEND );
}

根据this,这对我来说是意想不到的.另外this的例子似乎不起作用.

而具有非零参数的set_time_limit根本无效.

我想澄清一下.

如果您尝试在该循环中将某些输出写入浏览器,则应该发现如果连接已终止,则脚本将中止.在 ignore_user_abort的文档中暗示了此行为

When running PHP as a command line script, and the script’s tty goes
away without the script being terminated then the script will die the
next time it tries to write anything, unless value is set to TRUE

我自己尝试了一些实验,发现即使你尝试了一些浏览器输出,如果输出缓冲区还没有完成,脚本也会继续运行.如果关闭输出缓冲,则在尝试输出时脚本将中止.这是有道理的 – SAPI层应该注意到请求在尝试传输输出时已经终止.

这是一个例子……

//ensure we're  not ignoring aborts..
ignore_user_abort(false);

//find out how big the output buffer is
$buffersize=max(1, ini_get('output_buffering'));


while (true)
{
    sleep( 1 );

    //ensure we fill the output buffer - if the user has aborted, then the script
    //will get aborted here
    echo str_repeat('*', $buffersize)."\n";

    file_put_contents( '/tmp/foo' , "I'm alive ".getmypid()."\n" , FILE_APPEND );
}

这证明了触发中止的原因.如果您的脚本很容易进入无限循环而没有输出,则可以使用connection_aborted()来测试连接是否仍然打开.

相关文章
相关标签/搜索