2010-09-23 36 views
3

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

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

这是在Windows Server 2007上。

+0

set_time_limit(0); ignore_user_abort(真); header('Location:'。$ _ SERVER ['SCRIPT_NAME']); - 这不应该在理论上起作用吗?它似乎仍然在等待页面。这里的想法是让脚本运行,但发送用户回到上一页,以便在文件存在时由ajax通知。 – Chris 2010-09-23 17:11:41

+0

克里斯我假设可以工作,但它也会在高负载下杀死你的服务器! – Alfred 2010-09-23 18:34:26

+0

好的,我现在已经把它变成了一个工作表。使用set_time_limit(0)和ajax请求,它会在后台运行。 – Chris 2010-09-23 19:22:03

回答

1

您应该在不同的过程中运行它。建立一个连续运行的守护进程,命中一个数据库并寻找一个标志,比如“ShouldProcessData”。然后,当您打开该网站时,将该标志切换为真。守护进程会在下一次迭代中看到标志并开始处理。将结果粘贴到数据库中。使用数据库作为网站与长时间运行过程之间的沟通机制。

0

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

+0

虽然这可能是一个不错的选择,但我不想花时间安装,配置和学习如何使用它。我正在寻找一个更简单的解决方案,因为这不是任何东西的主要组成部分,只是另一名员工的节省时间的脚本。 – Chris 2010-09-23 16:21:53

+0

就我个人而言,尽管您的里程可能会有所不同,但我已将它从听到它的声音建立起来并运行到实际部署适合生产(工人,工作和所有人)的完成过程。它本质上是@ just_in_case的解决方案,只有_less_为你工作。 – Wrikken 2010-09-23 17:15:05

0

为什么不从您想要提供下载的页面发出ajax调用,然后等待ajax调用返回并在另一页上调用set_time_limit(0)。

+0

你用过这个吗?这将允许它运行,只要它需要?因为这是一个相当简单的选择,如果它。 – Chris 2010-09-23 16:25:05

1

在PHP中,你必须告诉你,你什么时候出你的过程

PHP manual set_time_limit()

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

相关问题