早期用PHP关闭连接

时间:2011-10-04 15:51:15

标签: php

我一直在尝试完成一个脚本,该脚本向用户浏览器发送正确的通知以关闭连接,但允许服务器继续处理请求。我的代码基于我所看到的:

http://www.php.net/manual/en/features.connection-handling.php#71172

close a connection early

ob_start();
echo ('Text the user will see');
$size = ob_get_length();
ignore_user_abort(); // optional
header('Content-Encoding: none');
header("Content-Length: $size");
header("Connection: close");
// flush all output
ob_end_flush();
ob_flush();
flush();

sleep(5);
//just a test to see if the script continues to run 
file_put_contents("trash/".date('dmY-H_i_s_1').".txt", "Some text.");
file_put_contents("trash/".date('dmY-H_i_s_2').".txt", "Some text.");
file_put_contents("trash/".date('dmY-H_i_s_3').".txt", "Some text.");

当我去运行脚本时,有时会创建第一个文件但不会将文本写入其中。有时它不会创建任何文件。如果我运行脚本并返回早期代码注释掉,那么所有三个文件都可以正常创建。 Zlib压缩已关闭。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您可以使用register_shutdown_function设置额外处理。

基本上,您在脚本完成后注册了一些内容并将所有输出发送给用户。这样,脚本可以在执行任何清理或不需要的操作后继续运行一段时间。

更新:我的不好,在PHP 4.1

之后不再适用

我找到的links you gaveother stuff似乎表明你做得对。您确定没有错误或脚本超时吗? PHP错误日志状态是什么?

答案 1 :(得分:0)

ignore_user_abort()必须有一个非null参数才能实际忽略用户中止。否则它只返回当前的忽略设置而不改变任何东西。所以你需要

ignore_user_abort(true);

答案 2 :(得分:0)

执行此操作的正确方法是在fastcgi模式下使用php,然后您可以使用该功能 fastcgi_finish_request(); 它将完全满足您的需求 - 它将关闭与浏览器的连接,但脚本的其余部分将继续运行到最后。

http://php-fpm.org/wiki/Features

这比依赖输出缓冲要好得多。