【发布时间】: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