【问题标题】:Need to run a long php script from a browser需要从浏览器运行很长的 php 脚本
【发布时间】:2010-09-23 15:58:39
【问题描述】:

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

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

这是在 Windows Server 2007 上。

【问题讨论】:

  • set_time_limit(0);忽略用户中止(真); header('位置:'.$_SERVER['SCRIPT_NAME']); ——这在理论上不应该有效吗?它似乎仍在等待页面。这里的想法是让脚本运行,但当文件存在时将用户返回到上一页以通过 ajax 通知。
  • 克里斯我认为这会起作用,但它也会在高负载时杀死你的服务器!
  • 好的,我现在已经把它变成了一个工作表单。使用 set_time_limit(0) 和 ajax 请求,它将在后台运行。

标签: php background


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在 PHP 中,你必须告诉你的进程想要什么超时

    PHP manual set_time_limit()

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 虽然这可能是一个不错的选择,但我不想花时间安装、配置和学习如何使用它。我正在寻找一个更简单的解决方案,因为这不是任何事情的主要组成部分,只是为其他员工节省时间的脚本。
      • 就个人而言,我在大约一小时内设置并运行了它,从听到它到实际部署适合生产(工人、工作和所有)的完成流程,尽管您的里程可能会有所不同。它本质上是 @just_in_case 的解决方案,只有 less 为您工作。
      【解决方案4】:

      您为什么不在要提供下载的页面上进行 ajax 调用,然后等待 ajax 调用返回并在其他页面上设置_time_limit(0)。

      【讨论】:

      • 你用过这个吗?这会让它运行多久就运行多久?因为这是一个相当简单的选择。
      猜你喜欢
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2015-01-28
      • 2017-04-16
      • 1970-01-01
      相关资源
      最近更新 更多