需要从浏览器运行一个很长的PHP脚本

时间:2010-09-23 15:58:39

标签: php background

我创建了一个脚本,从一些Web服务和我们的数据库中获取数据,格式化报告,然后将其压缩并使其可供下载。当我第一次启动时,我创建了一个命令行脚本来查看输出结果,以及在浏览器中查看时获得的脚本超时限制。但是因为我不希望我的用户必须从命令行使用它或者必须在他们的计算机上运行php,所以我想从我们的网络服务器上运行它。

因为这个脚本可能需要几分钟才能运行,所以我需要一种方法让它在后台处理,然后在文件成功创建后开始下载。让脚本运行而不触发超时的最佳方法是什么?我以前尝试过这个(使用反引号单独运行脚本等)但放弃了,所以我在这里问。理想情况下,用户可以单击表单上的“提交”按钮来启动请求,然后返回到页面,而不是让他们盯着空白的浏览器窗口。当它们存在的zip文件(意味着进程已经完成)时,它应该通知它们(通过AJAX?重新加载页面?我还不知道)。

这是在Windows Server 2007上。

4 个答案:

答案 0 :(得分:1)

您应该在不同的过程中运行它。创建一个持续运行的守护进程,命中数据库并查找标志,如“ShouldProcessData”。然后,当您点击该网站时,将标志切换为true。您的守护进程将在下一次迭代中看到该标志并开始处理。将结果粘贴到数据库中。使用数据库作为网站和长时间运行过程之间的通信机制。

答案 1 :(得分:1)

在PHP中,你必须知道你的过程需要多长时间

请参阅PHP manual set_time_limit()

您可能还有另一个问题:浏览器本身超时(可能约为1~2分钟)。虽然该超时应该可以在浏览器中更改(对于每个浏览器),但通常可以通过每隔20秒向浏览器发送一些数据来阻止超时用户端(例如下载的标题,你然后可以发送其他标题,如编码等...)。

答案 2 :(得分:0)

Gearman非常方便(创建后台任务,让javascript轮询进度)。它当然需要安装齿轮箱和安装。工人创造了。请参阅:http://www.php.net/gearman

答案 3 :(得分:0)

为什么不从要提供下载的页面进行ajax调用,然后等待ajax调用返回,另一页等待set_time_limit(0)。