PHP:运行预定作业(cron作业)

我在我的webhotel上有一个网站,我想运行一些计划任务。 你会推荐什么样的方法来实现?

到目前为止,我想到的是在每个页面的顶部都包含一个脚本,然后让这个脚本检查是否是时候运行这个工作。

这只是我想到的一个简单的例子:

if ($alreadyDone == 0 && time() > $timeToRunMaintainance) { runTask(); $timeToRunMaintainance = time() + $interval; } 

还有什么我应该考虑的,还是有比这更好的方法?

这就是cronjobs所做的。 man crontab假设你正在运行一个linux服务器。 如果你没有shell权限或者没有办法设置cronjobs,那么有免费的服务可以在外部服务器上设置cronjobs并且ping你的一个URL。

我现在正在回答这个问题,因为似乎没有人提到这个确切的解决scheme。

在我目前正在使用的网站上,我们使用cPanel设置了一个cron作业,而不是直接运行PHP解释器(因为我们使用的是CodeIgniter,而我们的代码映射到一个控制器函数,好主意)我们正在使用wget

 wget -q -O cron_job.log http://somehost/controller/method 

-q是这样,wget不会产生任何输出(所以你不会收到电子邮件)。 -O cron_job.log会将你的控制器生成的内容保存到一个日志文件(每次被覆盖,所以不会继续增长)。

我发现这是获得“正确”cron工作的最简单的方法。

如果你有一个cPanel主机,你可以通过web界面添加cron作业。进入高级 – > cron作业,并使用非高级表单来设置cron频率。 你需要一个像这样的命令:

 /usr/bin/php /path/to/your/php/script.php 

如果你想知道如何从cron运行你的PHP脚本,有两种select:直接调用PHP解释器(即“php /foo/myscript.php”),或者使用lynx(lynx http:// mywebsite。 com / myscript.php )。 你select哪一个主要取决于你的脚本如何configuration它的环境 – path和文件访问权限将会不同,这取决于你是通过shell还是web浏览器来调用它。 我build议使用l </s>。

一个副作用就是每次运行时都会收到一封电子邮件。 为了解决这个问题,我让我的cron PHP脚本没有输出任何东西(如果它们成功完成,它不会输出任何内容,甚至不是空格),如果输出失败,会输出错误信息。 然后我使用cron的一个小PHP脚本来调用它们。 这样,如果失败,我只会收到一封电子邮件。 这与lynx方法基本相同,除了我的shell脚本发出HTTP请求而不是lynx。

调用这个脚本“docron”或者别的东西(记住chmod + x),然后在你的crontab中使用命令:“docron http://mydomain.com/myscript.php ”。 它会通过电子邮件的forms将页面的输出作为HTML电子邮件发送,如果页面返回某些内容。

 #!/usr/bin/php <?php $h = @file_get_contents($_SERVER['argv'][1]); if ($h === false) { $h = "<b>Failed to open file</b>: " . $_SERVER['argv'][1]; } if ($h != '') { @mail("cron@mydomain.com", $_SERVER['argv']['1'], $h, "From: cron@mydomain.com\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1"); } ?> 

如果你想避免设置cron作业和什么(虽然我build议这是一个更好的方法),你提供的解决scheme是相当不错的。 在一些项目中,我已经让PHP脚本自己做了检查,看看是否该运行更新了。

反面(好的, 其中一个不利的一面)是,如果没有人在一段时间内使用应用程序,那么脚本将不会运行。

最重要的是,如果没有人在一段时间内使用应用程序,那么脚本将不会运行。 我设置的任务是“更新caching文件”,“每日备份”等等。 如果有人不使用应用程序,那么你将不需要更新的caching文件,也不会有任何数据库更改备份。

我build议你的方法的唯一修改是,只有当某人成功login时才运行这些检查。不需要检查每个页面的加载情况。

Cron是调度问题的通用解决scheme。 但是,当你做大,日程安排频率高时,可能会出现可靠性/重叠问题。 如果你看到这样的问题,考虑一下监督或更复杂的监控 。

你有没有看过ATrigger ? PHP库也可用于开始创build计划任务,无需任何开销。

免责声明:我是他们的团队之一。

如果你使用cPanel你应该添加这样的:

 /usr/local/bin/php -q /home/yoursite/public_html/yourfile.php 

你正在使用的方法是好的,如果你不想使用cronjobs或任何外部的,但这些可以是沉重的每一次页面加载检查。

起初,一些cronjobs可能会被取代。 例如,如果你有一个计数器,有多less用户在你的网站上注册过,你可以简单地在用户注册时更新这个数字,所以你不必为此使用cronjob或任何计划任务。

如果你想使用计划任务,我build议你现在使用你正在使用的方法,但稍作修改。 如果你的网站每天有足够的点击量,你可以简单地使任务运行(或任务检查function运行)只有1%或者0.01%的命中,而不是所有的命中,你应该使用的百分比取决于在页面上点击你有多less次,你想运行的任务。 所以,只需添加一个随机数发生器来实现这个function。

你可以简单地使用这样的function;

 if(rand (1, 100) <= 1) { // 1, 100 is used to generate a number between 1 and 100. 1 is for one percent. // Run the tasks system } 

希望这可以帮助,

我会用www.guardiano.pm外包cronjob,并每隔X分钟调用一次url。 当你的url(即www.yoursite.com/dothis.php)被调用,而不是你执行一些代码。 如果你不想让网页在你想要的时候请求页面,你可以只允许POST请求,并发送一些只有你知道的参数guardiano.pm

那就是我会做的,因为我在我的宠物项目上这样做。 玩的开心!

命令行PHP + cron将是我会走的路。 这很简单,应该符合法案。 它通常与PHP一起安装。

如果你没有设置cronjob的选项,你可以用cUrl调用脚本(作为wget的替代 – 相同的function)。 只需在本地机器上执行cUrl函数的计划任务即可。

如果你想要更抽象的东西,你可以考虑使用像PHP调度程序。 例如:

而且,为了parsingcronexpression式,你可以使用现有的库,比如https://github.com/mtdowling/cron-expression 。 它提供了很多有用的方法来帮助你找出一个cron工作的信息。

希望有所帮助。