2

我正在开发的 PHP Web 应用程序的一部分需要执行以下操作:

  1. 向 PHP 脚本发出 AJAX 请求,这可能需要一秒到一小时,完成后在页面上显示输出。
  2. 定期更新网页上的加载栏,由长期运行的 PHP 脚本中的状态变量定义。
  3. 允许长时间运行的 PHP 脚本检测 AJAX 请求是否被取消,以便它可以正确及时地关闭。

我目前的解决方案:

  • client.php:向 request.php 创建一个 AJAX 请求,然后每秒向 status.php 发出一个请求,直到初始请求完成。如果应用程序的多个实例正在运行,则生成并传递唯一标识符 (uid)。
  • request.php:每次进行时,将当前进度百分比保存到 $_SESSION["progressBar"][uid]。(每次都必须运行 session_start() 和 session_write_close()。)完成后,返回 client.php 需要的数据。
  • status.php:运行 session_start(),返回 $_SESSION["progressBar"][uid],然后运行 ​​session_write_close()。

不足之处:

我的解决方案满足了我的前两个要求。第三,我想在request.php中使用 connection_aborted()来了解请求是否被取消。但是,文档说:

在尝试向客户端发送信息之前,PHP 不会检测到用户已中止连接。简单地使用 echo 语句并不能保证发送信息,请参见 flush()。

我可以简单地给出毫无意义的输出,但是 PHP必须在每次调用 session_start() 时发送一个 cookie。我想使用相同的会话,但文档说:

使用会话 cookie 时,为 session_id() 指定 id 将始终在 session_start() 被调用时发送一个新的 cookie,无论当前会话 id 是否与设置的相同。

我对解决方案的想法,我都不满意:

  • 状态数据库,或写入临时文件,或任务管理系统。这似乎比我需要的更复杂!
  • 自定义会话处理程序。这与上述解决方案基本相同。
  • 在一个请求中同时传输进度数据和结果数据。这解决了一切,但我基本上会重新实现 AJAX。这不可能。

请告诉我我错过了什么!为什么 PHP 不能立即知道连接何时终止?为什么 PHP 必须重新发送 cookie,即使它完全相同?回答这些问题中的任何一个都会有很大帮助!

我由衷的感谢。

4

1 回答 1

1

为什么不设置第二个会话变量,由唯一的请求标识符和访问时间戳组成,来自status.php.

如果客户端关闭,它将停止获取更新并且会话变量停止更新,如果变量在一定时间内没有更新,则会status.php触发干净关闭。request.php

于 2013-01-11T19:04:53.743 回答