【问题标题】:Closing a connection early with PHP使用 PHP 提前关闭连接
【发布时间】:2011-10-04 15:51:14
【问题描述】:

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

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 压缩已关闭。有什么想法吗?

【问题讨论】:

  • 如果您希望服务器停止处理请求,请使用:exit() 或 die()
  • 你的意思是你想关闭与浏览器的连接,但在后台继续用 PHP 做事?不要认为你可以,除非你产生一个单独的进程。
  • @FeidaKila:在exiting 或dieing 之后,他将如何处理文件?
  • 是的,我确实希望服务器在关闭连接后继续在后台工作。

标签: php


【解决方案1】:

正确的做法是在fastcgi模式下使用php然后就可以使用函数了 fastcgi_finish_request(); 它将完全满足您的需要 - 它将关闭与浏览器的连接,但脚本的其余部分将继续运行到最后。

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

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

【讨论】:

  • 我很想试一试,但是我们的生产环境目前还没有设置为使用 fastcgi,而且切换它不是一个直接的选择。
【解决方案2】:

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

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

更新:我的错,PHP 4.1 之后不再适用

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

【讨论】:

  • 错误日志中没有错误。就像在最后一次刷新后尝试执行下一个命令,然后消失。
【解决方案3】:

ignore_user_abort() 必须有一个非空参数才能真正忽略用户中止。否则,它只会返回当前的忽略设置而不更改任何内容。所以你需要

ignore_user_abort(true);

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多