【问题标题】:PHP Script to re-run itself until process completed.and then restart every weekPHP脚本重新运行直到进程完成。然后每周重新启动
【发布时间】:2014-11-05 08:56:11
【问题描述】:

我制作了一个从 Web 服务检索 XML 内容的脚本。该过程需要每周运行一次,但脚本本身需要重新运行大约 180 次才能完成该过程。脚本的每次运行大约需要 3-8 分钟。我希望它在每次完成后重新运行大约 5 秒。

我目前的解决方案是:

  • Windows 的任务计划程序每周打开一次 php 页面。
  • 当脚本运行并完成时,javascript 使页面在完成后 5 秒重新启动。
  • 当脚本最后一次运行时,它会删除页面的重新加载,从而停止。

这个解决方案的问题是它每周都会打开一个新的浏览器窗口。有没有什么好的替代方法可以做到这一点而不必手动关闭浏览器?

脚本重新运行的原因是由于php服务器最大限制的脚本超时设置,以及每次运行后查看状态是否发生错误的可能性。

我没有使用 cron,因为它需要进行非常多的轮询才能让进程在上次运行的 5 秒内启动。对于脚本的每周启动,我假设只要脚本使用 javascript 重新运行自己,它就不会工作?

【问题讨论】:

  • 我确信有一个更好的解决方案,它不需要打开浏览器来运行 javascript。为什么需要 javascript 而不是在 php 中调用一个函数 180 次?
  • @wolfemm 好问题。我实际上在 PHP 中做了一些模糊相似的事情 - 一个脚本必须运行多次才能完成一项任务(糟糕的设计但解决方案就足够了,再多的东西都会是矫枉过正),我最终做的只是分叉直到有没有更多的工作要做。我不需要浏览器,虽然我只是从命令行调用脚本并且它负责分叉本身。当然应该注意不要炸毁机器,但跟踪状态并不是那么糟糕。

标签: javascript php web-services cron automatic-updates


【解决方案1】:

使用 PHP:

<?php

// increase the maximum execution time to 43200 seconds (12 hours)
set_time_limit(43200);

function runTask() {
    static $cycles = 0;

    // do whatever you need to do

    // Increments cycle count then compares against limit
    if ($cycles++ < 180)  {
        sleep(5);  // wait five seconds
        runTask(); // run it again
    }
}

runTask(); // fire up the loop

或者,如果你是 Javascript 的粉丝......

使用 node.js:

var cycles = 0;

function runTask() {
  // do whatever you need to do

  // Increments cycle count then compares against limit
  if (cycles++ < 180) {
    setTimeout(runTask, 5000); // run again in 5000 milliseconds
  }
}

runTask(); // fire up the loop

在每次迭代完成 5 秒后,这两种解决方案都不会再次运行该函数。

只需让您的任务运行器直接执行任一脚本即可;无需浏览器。

【讨论】:

  • 您好,感谢您的回复。问题是 PHP 脚本然后超时。总的来说,脚本一遍又一遍地重新运行相同的任务/功能,脚本大约需要 11-12 小时才能完成。
  • @laplagam 我已经用一行编辑了我的答案,以增加 PHP 的最大执行时间。
  • 这个脚本仍然超时。不幸的是,set_time_limit 不能超过我认为的 30 分钟左右。
  • 我已经更新了正文以进一步澄清。我的 php 服务器拒绝脚本连续运行 12 小时,而且我希望每次运行后都可以查看状态是否一切正常,而无需等待 12 小时才能发现,他们可能必须重新运行所有内容。
猜你喜欢
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 2022-11-12
  • 2013-03-20
  • 2023-01-24
  • 1970-01-01
相关资源
最近更新 更多