Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有客户端回调的Php长脚本_Javascript_Php_Pdf - Fatal编程技术网

Javascript 带有客户端回调的Php长脚本

Javascript 带有客户端回调的Php长脚本,javascript,php,pdf,Javascript,Php,Pdf,我有一个非常长的过程在php脚本生成一个巨大的pdf。 在我的HTML页面中有一个启动php脚本的按钮,我想显示一种进度条或至少一个动画gif,当php脚本结束时,显示生成的pdf pdf的生成可能会持续15分钟,因此php引擎会超时退出,浏览器也会超时退出 有没有一种方法可以声明一种客户端回调,在服务器端进程结束后立即调用 谢谢你的回复 编辑: 感谢您的回复: 如果我完全理解,我必须在服务器端启动进程并分离我的客户端,即不要等到进程结束。相反,我的客户机应该定期检查服务器端进程的进度。对吧?

我有一个非常长的过程在php脚本生成一个巨大的pdf。 在我的HTML页面中有一个启动php脚本的按钮,我想显示一种进度条或至少一个动画gif,当php脚本结束时,显示生成的pdf

pdf的生成可能会持续15分钟,因此php引擎会超时退出,浏览器也会超时退出

有没有一种方法可以声明一种客户端回调,在服务器端进程结束后立即调用

谢谢你的回复

编辑:

感谢您的回复: 如果我完全理解,我必须在服务器端启动进程并分离我的客户端,即不要等到进程结束。相反,我的客户机应该定期检查服务器端进程的进度。对吧?

如果是这样,我可以使用以下场景:

客户端向服务器发送一个ajax请求。服务器启动 进程并将guid返回给客户端。此guid标识 工作。 客户机定期检查作业的进度 通过Ajax请求,从其guid。 作业完成后,客户机可以向服务器发出最后一个Ajax查询 下载PDF
这意味着服务器必须将生成的PDF保存在磁盘上,等待最后的Ajax请求发送文件并删除它,对吗?

长达15分钟的时间,我甚至不会为此使用web套接字。15分钟是一段很长的时间,实际上不知道用户在此期间将要做什么。在这种情况下,断开连接的通知过程可能更可靠

考虑以下情况:

用户启动进程,从而在数据库中存储一条记录,使进程排队进行。 用户将立即看到一个页面,指示进程已排队,并且他们可以继续使用该应用程序。 每分钟定期运行的独立应用程序?每隔几分钟?检查数据库中排队的进程,将其状态更新为“进行中”,以便后续运行不会拾取相同的记录,并对其进行处理。 当每个进程完成时,它要么从数据库中删除,要么更新为已完成状态。 否则,将通知用户该过程已完成。 此最终通知可以通过多种方式完成。例如,可以向用户发送电子邮件。或者考虑类似于脸谱网通知栏的用户体验。当页面加载时,网站中的每个页面都可以检查已完成的流程,并在UI中显示一个通知,将用户引导到流程结果。如果用户在任何给定页面上花费大量时间,那么这将是一个使用web套接字或通过JavaScript进行长时间轮询以不断检查已完成进程的好地方


主要的事情是将用户界面与长期运行的流程分开。Web应用程序的设计不适合运行那么长时间的进程。通过分离关注点,web应用程序可以只关注用户界面,而命令行应用程序可以关注处理。作为额外的好处,这将防止用户在服务器上加载过多并发进程。命令行应用程序一次只能运行一条记录,因此太多的并发进程只会降低响应速度,而不会降低服务器的响应速度。

正如@David所说,但没有人涉及进度条,这取决于您所知道的创建pdf的应用程序

你知道pdf文件完成后的大小吗。 你知道要多久吗 这需要时间来产生。 你有可以挂接的代码吗 以更新进度。 应用程序需要知道何时更新完成百分比,以及更新多少。如果您可以这样做,那么您可以使用包装PDF并在面向用户的页面上读取的脚本将进度存储在数据库中,或者将其存储在文件中,等等

jQueryUI进度条很容易使用,但您必须知道完成的百分比,才能告诉最终用户


在这之后,使用ajax jquery$.post和一个文件就非常简单了,我就是这样做的。我只是编写了一个简单的文本文件,其中的数字表示完成百分比。通过ajax加载它,并将其提供给jquery ui进度小部件。

您真的应该将其推到后台,并在完成后通过电子邮件通知客户端。