关闭连接后继续处理

End*_*age 27 php

有没有办法在PHP中关闭连接(基本上告诉浏览器,而不是没有更多的数据),但继续处理.我想到的具体情况是我想要提供缓存数据,然后如果缓存已过期,我仍然会提供缓存数据以获得快速响应,关闭连接,但继续处理以重新生成并缓存新数据.基本上唯一的目的是使网站看起来更具响应性,因为在用户等待内容重新生成时不会偶尔出现延迟.

更新:

PLuS最接近我正在寻找的答案.为了澄清一些人,我正在寻找能够实现以下步骤的东西:

  1. 用户请求页面
  2. 连接将打开到服务器
  3. PHP检查缓存是否已过期,如果仍然是新鲜的,则提供缓存和关闭连接(在此处结束).如果已过期,请继续执行4.
  4. 服务过期的缓存
  5. 关闭连接,以便浏览器知道它不等待更多数据.
  6. PHP重新生成新数据并缓存它.
  7. PHP关闭.

更新:

这很重要,它必须是纯粹的PHP解决方案.安装其他软件不是一种选择.

Ada*_*nez 24

如果在fastcgi下运行,你可以使用非常好的:

fastcgi_finish_request();

http://php.net/manual/en/function.fastcgi-finish-request.php

更多详细信息可在重复的答案中找到.


End*_*age 14

我终于找到了解决方案(感谢Google,我只是不得不继续尝试不同的搜索词组合).感谢此页面上arr1的评论(它大约是页面的三分之二).

<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true);
ob_start();
echo 'Text the user will see';
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // All output buffers must be flushed here
flush();        // Force output to client
// Do processing here 
sleep(30);
echo('Text user will never see');
Run Code Online (Sandbox Code Playgroud)

我还没有真正测试过这个,但是,简而言之,你发送了两个标题:一个告诉浏览器确切的数据,然后告诉浏览器关闭连接(只有在收到预期的数量后才会内容).我还没有测试过这个.

  • 不适合我.用户仍然被迫在睡眠期间等待. (6认同)
  • 我在php-fpm下运行并发现我可以这样做:fastcgi_finish_request(); (5认同)
  • @Adam 我们发现有很多事情会搞砸系统。如果您的内容长度错误(包括太大),它似乎会中断。我只让它处理 CSS 和 JS 文件。您的托管/服务器可能会添加额外的内容来跟踪和删除一些必需的标头以使其正常工作。我假设检查了 mime 类型,因此不会修改 CSS 和 JS 文件,因此为什么该系统适用于它们。 (2认同)

小智 7

您可以通过将时间限制设置为无限制并忽略连接来实现

<?php
ignore_user_abort(true);
set_time_limit(0);
Run Code Online (Sandbox Code Playgroud)

另见:http://www.php.net/manual/en/features.connection-handling.php