我在php脚本中有一个很长的过程(生成一个巨大的pdf)。 我的HTML页面中有一个按钮,用于启动php脚本,我想显示一种进度条或至少是动画gif,当php脚本结束时,显示生成的pdf。
pdf的生成可能持续15分钟,因此php引擎会在超时和浏览器中退出。
我有办法声明一种客户端回调,一旦服务器端进程结束就会被调用吗?
感谢您的回复
修改:
感谢您的回复:) 如果我很好理解,我必须在服务器端启动该过程并且"分离"我的客户,即不等待,直到过程结束。相反,我的客户应该定期检查服务器端进程的进展。对吗?
如果是这样,我可以使用以下方案:
这意味着服务器必须将生成的PDF保存在其磁盘上并等待最终的Ajax请求发送文件并将其删除,对吧?
答案 0 :(得分:0)
对于长达15分钟的东西,我甚至不会使用网络套接字。 15分钟是长时间,并且在此期间真的没有告诉用户将要做什么。在这种情况下,断开连接的通知过程可能会更可靠。
考虑类似的事情:
这个最终通知可以通过多种方式完成。例如,可以向用户发送电子邮件。或者考虑类似于Facebook通知栏的用户体验。网站中的每个页面都可以检查"已完成"页面加载并显示"通知"在UI中,用户指向进程的结果。如果用户在任何给定页面上花费大量时间,那么此将是使用Web套接字或通过JavaScript进行长轮询以继续检查已完成流程的好地方。
主要是将用户界面与长时间运行的进程分开。设计的Web应用程序不适合长时间运行的进程。通过分离关注点,Web应用程序可以只关注用户界面,命令行应用程序可以专注于处理。 (作为一个额外的好处,这将阻止用户过多地使用过多的并发进程加载服务器。命令行应用程序一次只能运行一条记录,因此太多的并发进程只会减慢响应速度,而不是服务器。)
答案 1 :(得分:0)
正如@David所说,但没有人覆盖进度条,这取决于你所知道的(你是创建pdf的应用程序)。
应用程序需要一种方法来了解何时更新已完成的百分比以及更新百分比。如果您可以这样做,那么您可以使用包装PDF的脚本将进度存储在数据库中,并在面向用户的页面上读取它,或将其存储在文件中等。
jQuery UI进度条易于使用,但您必须知道能够告诉最终用户的百分比。
之后使用ajax(jquery $ .post)和文件非常简单,我就是这样做的。我只是怀疑一个简单的文本文件,其中一个数字代表完成百分比。通过ajax加载它并将其提供给jquery ui进度小部件。