我一直在尝试完成一个脚本,该脚本向用户浏览器发送正确的通知以关闭连接,但允许服务器继续处理请求。我的代码基于我所看到的:
http://www.php.net/manual/en/features.connection-handling.php#71172
和
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压缩已关闭。有什么想法吗?
答案 0 :(得分:0)
您可以使用register_shutdown_function设置额外处理。
基本上,您在脚本完成后注册了一些内容并将所有输出发送给用户。这样,脚本可以在执行任何清理或不需要的操作后继续运行一段时间。
我找到的links you gave和other 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
这比依赖输出缓冲要好得多。