我正在开发的 PHP Web 应用程序的一部分需要执行以下操作:
- 向 PHP 脚本发出 AJAX 请求,这可能需要一秒到一小时,完成后在页面上显示输出。
- 定期更新网页上的加载栏,由长期运行的 PHP 脚本中的状态变量定义。
- 允许长时间运行的 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,即使它完全相同?回答这些问题中的任何一个都会有很大帮助!
我由衷的感谢。