我有一个PHP脚本,可根据请求生成大型PDF文档。这通常需要大约1-2分钟,并且让用户知道它已完成的唯一方法是在整个过程完成时发送电子邮件。
我希望在生成文件时向用户显示某种进度条。处理此任务的最佳方法是什么?我唯一想到的是PDF生成脚本应该将数据保存在数据库中(我已经在项目中使用了MySQL),而在客户端我可以包含Ajax请求,该请求将轮询此进度数据说每5秒钟显示给用户。所以可能会有两个Ajax请求:一个用于启动PDF生成脚本,另一个用于用户查看进度。
我想我可以这样做,但有没有我可能不知道的标准方式?
答案 0 :(得分:4)
......可能是最简单的,也可以在已知的基础上行走,因此您可以轻松处理和调试。
对于它我只能添加你可以使用fork / exec / passthrough而不是启动PDF生成的ajax调用。
PHP Gearman是一个独立的服务器,您可以在具有PHP通信库的计算机上运行。
您可以让Gearman守护程序运行,为其设置任务并将数据写入数据库以获取进度条。这种设置的优点是fork / exec / passthrough是昂贵的操作 - Gearman是一个守护进程已经在上,所以它处理对PHP工作者的exec调用,你的触发脚本将需要工作更短的时间。
我不确定它是否有通信API向Gearman询问某个工作人员的状态,从而避免在鸡尾酒中添加数据库。
答案 1 :(得分:2)
使用一个需要很长时间才能完成的过程,我会说使用ajax轮询数据库的建议可能是完成工作的最简单方法。
我看到的另一个替代方案是,如果您的初始请求(实际的PDF生成脚本)生成无缓冲输出,您可以直接将其输出回浏览器。但这可能会受到PHP echo
的限制,您还必须担心浏览器/网络服务器超时。
答案 2 :(得分:0)
如果不在数据库中保存pdf的内容,则无法显示进度条。我建议为什么不使用处理图像并告诉用户处理。