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

Eik*_*ern 41 php cron scheduling scheduled-tasks

我的网站上有一个网站我想运行一些预定的任务.你会推荐哪些方法来达到这个目的?

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

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

if ($alreadyDone == 0 && time() > $timeToRunMaintainance) {
   runTask();
   $timeToRunMaintainance = time() + $interval;
} 
Run Code Online (Sandbox Code Playgroud)

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

Arm*_*her 34

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

  • siteuptime.com可以设置为定期ping您网站上的页面 - 表面上检查正常运行时间,但如果它们位于可访问的脚本中,则可能触发您的工作.最好的方法是设置自己的crontab /预定任务,因此意外的用户访问无法重新运行您的作业 (3认同)

小智 17

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

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

wget -q -O cron_job.log http://somehost/controller/method
Run Code Online (Sandbox Code Playgroud)

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

我发现这是让'正确'的cron工作最简单的方法.


Dav*_*lin 12

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

/usr/bin/php /path/to/your/php/script.php
Run Code Online (Sandbox Code Playgroud)


Kou*_*sha 6

你见过ATrigger吗?该PHP库也可以启动没有任何开销创建计划任务.

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


MrZ*_*bra 5

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

一个副作用是每次运行时都会收到一封电子邮件.为了解决这个问题,我让我的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("cron@mydomain.com", $_SERVER['argv']['1'], $h, "From: cron@mydomain.com\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1");
}

?>
Run Code Online (Sandbox Code Playgroud)