2008-09-23 219 views
34

我在我的webhotel上有一个网站我想运行一些计划任务。你会推荐什么方法来达到这个目标?PHP:运行预定作业(cron作业)

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

这是什么,我想只是一个简单的例子:

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

别的我应该考虑到或有更好的方法比这个?

回答

32

这就是cronjobs制作的。 man crontab假设你正在运行一个linux服务器。如果您没有shell访问权限或无法设置cronjobs,则可以使用免费服务在外部服务器上设置cronjob并ping您的一个URL。

+1

你知道有人可以推荐吗? – Eikern 2008-09-23 10:38:49

+3

Siteuptime.com可以设置为定期在您的网站上ping页面 - 表面上检查正常运行时间,但如果它们在可访问的脚本中可能会触发您的工作。最好的办法是设置你自己的crontab /计划任务,所以意外的用户访问不能重新运行你的工作 – ConroyP 2008-09-23 10:42:42

5

如果你想知道如何真正从cron运行你的PHP脚本,有两种选择:直接调用PHP解释器(即“php /foo/myscript.php”)或使用lynx(lynx http://mywebsite.com/myscript.php) 。您选择哪一个主要取决于您的脚本如何配置其环境 - 路径和文件访问权限将因您是通过shell还是Web浏览器调用而有所不同。我建议使用l。。

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

调用此脚本“docron”或其他内容(请记住chmod + x),然后在crontab中使用以下命令:“docron http://mydomain.com/myscript.php”。如果页面返回一些内容,它会以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("[email protected]", $_SERVER['argv']['1'], $h, "From: [email protected]\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1"); 
} 

?> 
+0

我完全同意这里的意图。如果不能直接调用解释器,另一个好的选择是wget。 – Laith 2008-09-23 13:59:58

0

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

12

如果您有一个cPanel主机,您可以通过Web界面添加cron作业。转至高级 - > Cron Jobs并使用非高级表单设置cron频率。你想这样的命令:

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

大我一直在寻找这个 我觉得对Perl我应该使用/ usr/bin中/ perl的:对 – 2009-03-27 19:40:43

4

如果你想避免设立cron作业和诸如此类的东西(虽然我建议这是一个更好的方法),您所提供的解决方案是相当不错的。在许多项目中,我已经让PHP脚本自己做了检查,看看是否该运行更新了。

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

好方面是,如果没有人在某段时间内使用应用程序,那么脚本将不会运行。我设置的任务是“更新缓存文件”,“每日备份”等等。如果有人没有使用该应用程序,那么您将不需要更新的缓存文件,也不会有任何数据库更改来备份。

我建议您对方法进行的唯一修改是您只有在某人成功登录时才运行这些检查。您无需检查每个页面加载情况。

14

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

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

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

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

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

+1

谢谢,我喜欢-q开关,因为我一直在思考如何制止这些邮件的到来。你也可以分享你的提示:) – 2009-09-20 17:46:02

+1

-o location.log(小写字母o代替大写字母o)可用于输出日志(当未设置-q时,通常会在stdout上输出日志)。 -a和-o一样,但附加到文件中,其中-o覆盖。 – zpon 2012-03-26 11:28:09

4

Cron是一个调度问题的通用解决方案。但是,当你进行大规模的工作并且时间表频率越来越高时,就会出现可靠性/重叠问题。如果您发现此类问题,请考虑诸如supervise或更复杂的monit

0

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

1

如果您不想使用cronjob或外部任何内容,但您使用的方法很好,但每次页面加载时可能会很沉重。

起初,一些cronjobs可能会被替换。例如,如果您有一个有多少用户在您的网站上注册的计数器,您可以在用户注册时简单地更新此号码,因此您不必为此使用cronjob或任何计划任务。

如果你想使用计划任务,我建议你现在使用你正在使用的方法,但稍加修改。如果您的网站每天有足够的点击量,您只需将运行的任务(或任务检查功能运行)仅设为1%或约0.01%,而不是全部设置,则应使用的百分比取决于在页面上点击你有多少次,你想运行任务。因此,只需添加一个随机数发生器即可实现此功能。

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

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 
} 

希望这有助于

4

你有没有看ATriggerPHP library也可用于开始创建计划任务,无需任何开销。

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

3

如果您使用的cPanelü应添加此类似:

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

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

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