【问题标题】:PHP and scheduled tasksPHP 和计划任务
【发布时间】:2010-12-21 05:03:51
【问题描述】:

我正在尝试列出在 PHP 上运行计划任务的不同方法。我的目的是提供一种在 PHP 中运行计划任务的通用方法。到目前为止,我有:

1) 分析网站流量。如果您每天收到 770 次点击(即每 2 分钟一次点击),并且您计划在早上 6:00 运行任务,并且访问者在早上 5:59 请求页面,那么运行该任务,因为下一个访问者将平均早上 6:01 到达。在这种情况下运行 = exec('/usr/bin/php -f /home/account/cron.php')。

(+) 只要路径正确,就可以在所有平台上使用。

(-) 需要一些 CPU 能力。

(-) 需要 exec()。

(-) 在较小的网站或流量高峰较大的网站上并不准确。

2) 上述改进版。当用户请求页面并且任务要运行时,不要使用 exec() 而是在将内容刷新给用户之后使用 include()。

(+) 适用于所有平台。

(+) 没有 exec() 的。

(-) 需要一些 CPU 能力。

(-) 在较小的网站或流量高峰较大的网站上并不准确。

3) 运行一个单独的进程后台,使其在一个恒定循环中运行。提供一个管理界面,让您“启动”和“结束”“服务”。然后它将使用 fsockopen() 调用无限运行的 .php 脚本。它使用 sleep() 来不消耗资源并在时间合适时唤醒(参见:time_sleep_until())。它可以搜索文件并阅读它们以了解何时运行哪些任务。可以创建文件“run-everyday-3.00am”,使调度程序运行其中的代码。

(+) 适用于所有平台。

(+) 没有 exec() 的。

(+) 可能非常准确(例如,如果它每分钟睡眠一次)。

(-) 不稳定 - 服务器崩溃完全停止调度程序。

(-) 某些主机不喜欢 24/7/365 = 资源占用的进程?

4) 直接在 Linux 等平台上运行 exec('crontab')。

(+) 这不是资源消耗。

(+) 是准确的。

(-) 执行().

(-) 不适用于所有平台。

5) 要求 cPanel 凭据并对其进行 POST 以创建/管理/删除 crons。

(+) 准确

(+) 这不是资源消耗。

(-) 不利于安全

(-) 需要用户详细信息 = 可用性降低

(-) 不适用于所有平台(需要在 Windows 上不支持的 cPanel)。

(-) 需要 cPanel。

还有其他想法吗?

【问题讨论】:

  • 根据我的经验,大多数不提供某种形式的 crontab 访问的主机也对 PHP 脚本有固定的 max_execution_time 限制。同样,大多数没有固定执行时间限制的设备往往也提供至少基本的 crontab 访问权限。
  • 恐怕“/usr/bin/php”不会“在所有平台上工作”——当然不是任何 Windows 平台,任何明确处理 cron 的东西也不会

标签: php scheduled-tasks


【解决方案1】:

您建议的几乎所有方法都很难看,尽管大多数方法都行得通。

我丑陋的替代方案是在具有 Internet 连接的本地计算机上设置 cron,每隔几分钟运行一次 curl 命令。

它和你所有的解决方案一样丑陋,但它稍微可靠一些。

【讨论】:

    【解决方案2】:

    我使用名为 VisualCron 的 Windows 工具在远程服务器上 ping 受 http-password 保护的脚本,然后执行特定任务。 V-C 还内置了不错的电子邮件状态通知。

    请注意,这与 Zack 关于使用本地 cron+curl 或 cron+wget 的帖子非常相似

    http://www.visualcron.com http://www.visualcron.com/img/screenshots/v5/mainwindow/mainwindow_bluetheme.png

    【讨论】:

      【解决方案3】:

      你用过windows task schedulerat command吗?可以将它用作 UNIX 上 CRON 的替代品。您可以 (1) 编写一个 PHP 脚本来执行所有必要的琐事 (2) 在 UNIX 上设置 CRON 作业或在 Windows 上设置计划任务以通过 PHP CLI 执行此脚本。

      也可以通过从远程机器上打开 HTTP 来执行脚本。远程机器可以是 UNIX 或 Windows 机器。 wget 可以代替网络浏览器使用,并且适用于两个平台。

      【讨论】:

        【解决方案4】:

        我会选择第二台服务器/虚拟机来运行这些类型的计划任务。第二台服务器可以在异地执行其他功能,例如在主服务器无响应时通知您等。

        顺便问一下,你对“准确”的定义是什么?

        【讨论】:

          【解决方案5】:

          恕我直言,你应该在这些方法之上写一个层......

          User code <=> [User interface]<-> Your library <->[Technology interface] <=> Technology execution module (method)
          

          那么您不必实现所有方法,但如果您或您的客户需要一种新方法……他所要做的就是实现您的技术接口。

          顺便说一句,“技术执行方法”可以写成 PHP 模块以获得更好的性能/主机系统集成。

          如果我是你,我会寻找现有的库/模块,并且我不会创建后台进程,除非底层系统无法处理计划任务(unix 和 windows 确实可以处理它们)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-22
            • 2013-02-05
            相关资源
            最近更新 更多