3

可能重复:
显示 PHP 长脚本的进度

我有一个 PHP 脚本,可以根据要求生成大型 PDF 文档。这通常需要大约 1-2 分钟,让用户知道它已完成的唯一方法是在整个过程完成时发送电子邮件。

我想在生成文件时向用户显示某种进度条。完成这项任务的最佳方法是什么?我唯一想到的是生成 PDF 的脚本应该将数据保存在数据库中(我已经在项目中使用了 MySQL),并且在客户端我可以包含 Ajax 请求,该请求将轮询此进度数据说每 5 秒显示给用户。所以可能会有两个 Ajax 请求:一个启动 PDF 生成脚本,另一个让用户查看进度。

我想我可以这样做,但是有没有我可能不知道的标准方法?

4

3 回答 3

4

您提出的方法:

...可能是最简单的,它也在已知的场地上行走,因此您可以轻松处理和调试。

对此我只能补充一点,您可以使用 fork/exec/passthrough 而不是启动 PDF 生成的 ajax 调用。

一种更优雅(阅读:复杂)的方法:

PHP Gearman是一个独立的服务器,您可以在具有 PHP 通信库的机器上运行。

您可以让 Gearman 守护程序运行,给它一个任务来处理并将数据写入数据库以获得进度条。这种设置的优点是 fork/exec/passthrough 是昂贵的操作——Gearman 作为一个守护进程已经启动,因此它处理对 PHP 工作者的 exec 调用,并且您的触发脚本将需要工作更短的时间。

我不确定它是否有一个通信 API 来向 Gearman 询问某个工人的状态,从而避免向鸡尾酒中添加数据库。

于 2012-08-02T16:13:12.103 回答
2

对于一个需要很长时间才能完成的过程,我想说您使用 ajax 轮询数据库的建议可能是完成工作的最简单方法。

我看到的唯一另一种选择是,如果您的初始请求(实际的 PDF 生成脚本)生成无缓冲输出,您可以将其直接通过管道传回浏览器。但这会受到echoPHP 的限制,而且您还必须担心浏览器/网络服务器超时。

于 2012-08-02T16:04:31.330 回答
0

如果不将 pdf 的内容保存在数据库中,您将无法显示进度条。我建议为什么不使用处理图像并告诉用户处理。

于 2012-08-02T16:13:24.300 回答