我正在尝试列出在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。
还有其他想法吗?
答案 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会处理它们),否则我不会创建后台进程。