执行繁重查询时加载消息而不是超时

时间:2015-06-11 08:49:14

标签: php zend-framework-mvc

我正在使用db2数据库运行Zend服务器和ZF1。对于某些导出,查询需要很长时间(> 50秒),这会导致408超时错误。我正在寻找一种解决方案,在运行SQL查询时在客户端上显示加载消息。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您需要增加php允许的最长执行时间,以便它可以完成并且不会以408返回代码终止。仅适用于该脚本的本地: http://php.net/manual/en/function.set-time-limit.php 或全球: http://php.net/manual/en/info.configuration.php#ini.max-execution-time

显示加载进度的最简单方法是使用AJAX请求执行长作业。您的主页应显示加载进度并使用Javascript向导出脚本发出请求。当该导出脚本完成时,主页面可以显示成功消息。

如果导出脚本创建类似需要下载的CSV文件,而不是将该CSV作为响应正文发送,则可以将其输出到服务器上的文件,然后在响应中发送该文件的URL。您在主页面中的Javascript可以显示该URL并提示用户在成功消息中下载它。

另一种方法是构建一个作业队列。这可以使用排队系统或仅使用数据库中的作业表来完成。当用户请求导出时,您将创建一个新作业。您需要一个在服务器上运行的进程,例如,作为一个cron作业,它检查表中是否有所有新作业,当有一个进程时,它运行导出并更新作业的状态。在您的页面中,您需要定期使用Javascript或只需重新加载页面,检查作业状态并在完成后显示成功消息。同样,如果导出创建了一个文件,服务器进程需要编写它,并在成功消息中包含要下载的链接。