PHP和计划任务

时间:2009-11-28 12:35:59

标签: php scheduled-tasks

我正在尝试列出在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')。

(+)这不是资源匮乏。

(+)准确无误。

( - )exec()。

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

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

(+)准确

(+)这不是资源匮乏。

( - )安全性差

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

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

( - )需要cPanel。

还有其他想法吗?

5 个答案:

答案 0 :(得分:4)

你建议的几乎所有方法都很难看,尽管大多数方法都有效。

我的丑陋替代方案是在具有互联网连接的本地计算机上设置cron,该计算机会在几分钟内运行curl命令。

它和您的所有解决方案一样丑陋,但它更可靠。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

您曾使用过windows task scheduler还是at command?可以在UNIX上将其用作CRON的替代。您可以(1)编写一个执行所有必要杂务的PHP脚本(2)在UNIX上设置CRON作业或在Windows上设置Scheduled Task以通过PHP CLI执行此脚本。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

然后你不必实现所有方法,但如果你或你的客户需要一种新方法......他所要做的就是实现你的技术接口。

BTW,“技术执行方法”可以编写为PHP模块,以实现更好的性能/主机系统集成。

如果我是你,我会寻找现有的库/模块,除非底层系统无法处理预定任务(unix和windows会处理它们),否则我不会创建后台进程。