关闭连接后继续处理

php
2022-08-30 13:38:49

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

更新:

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

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

更新:

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


答案 1

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

fastcgi_finish_request();

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

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


答案 2

我终于找到了一个解决方案(多亏了谷歌,我不得不继续尝试不同的搜索词组合)。感谢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');

我还没有实际测试过这一点,但简而言之,你发送了两个标头:一个告诉浏览器确切的期望数据量,另一个告诉浏览器关闭连接(只有在收到预期的内容量后才会这样做)。我还没有测试过这个。


推荐