如何使用PHP创建cron作业?

时间:2013-09-11 09:27:06

标签: php cron

我刚开始使用cron job。我甚至不知道如何写它。我试图从互联网上搜索,但我仍然不太了解它。我想创建一个每分钟执行我的代码的cron作业。我正在使用PHP来创建它。它不起作用。

示例

run.php (将每分钟执行一次的代码)

<?php

echo "This code will run every minute";

?>

cron.php

<?php

$path = dirname(__FILE__);
$cron = $path . "/run.php";
echo exec("***** php -q ".$cron." &> /dev/null");

?>

假设这两个文件位于同一文件夹中。

我做错了代码吗?如果错了,请告诉我如何修复它。

12 个答案:

答案 0 :(得分:55)

这是迄今为止我发现的PHP代码的最佳解释:

http://code.tutsplus.com/tutorials/managing-cron-jobs-with-php--net-19428

简而言之:

虽然安排一份新工作的语法乍一看似乎令人生畏,但一旦你将其分解,实际上相对简单易懂。一个cron作业将始终有五列,每列代表一个按时间顺序排列的运算符&#39;然后是完整路径和执行命令:

* * * * * home / path / to / command / the_command.sh

每个时间顺序列都与任务的时间表具有特定的相关性。它们如下:

Minutes represents the minutes of a given hour, 0-59 respectively.
Hours represents the hours of a given day, 0-23 respectively.
Days represents the days of a given month, 1-31 respectively.
Months represents the months of a given year, 1-12 respectively.
Day of the Week represents the day of the week, Sunday through Saturday, numerically, as 0-6 respectively.

enter image description here

所以,例如,如果一个人想在每个月的第一天安排一个任务,那么它看起来像这样:

0 0 1 * * home / path / to / command / the_command.sh

如果我们想安排一个任务在每个星期六上午8:30运行,我们将按如下方式编写:

30 8 * * 6 home / path / to / command / the_command.sh

还有许多运营商可用于进一步定制日程安排:

Commas is used to create a comma separated list of values for any of the cron columns.
Dashes is used to specify a range of values.
Asterisksis used to specify 'all' or 'every' value

访问完整文章的链接,它解释道:

  1. 如果您想手动输入/编辑,可以使用cronjob的格式。
  2. 如何使用PHP和SSH2库作为用户进行身份验证,您将要编辑哪个crontab。
  3. 完整的PHP类,包含用于身份验证,编辑和删除crontab条目的所有必要方法。

答案 1 :(得分:30)

与尝试运行cron.php的方式相同,您可以运行另一个PHP脚本。您必须通过CLI界面执行此操作。

#!/usr/bin/env php
<?php
# This file would be say, '/usr/local/bin/run.php'
// code
echo "this was run from CRON";

然后,在crontab中添加一个条目:

* * * * * /usr/bin/php -f /usr/local/bin/run.php &> /dev/null

如果run.php脚本具有可执行权限,则可以直接在crontab中列出,也可以不使用/ usr / bin / php部分。脚本中的'env php'部分将找到实际运行PHP代码的相应程序。因此,对于“可执行”版本,请向文件添加可执行权限:

chmod +x /usr/local/bin/run.php

然后,将以下条目添加到crontab:

* * * * * /usr/local/bin/run.php &> /dev/null

答案 2 :(得分:10)

添加到Alister,您可以通过在服务器上的ssh会话中输入crontab -e来编辑crontab(通常不是这种情况)。

星星代表(*表示每个单位):

[Minute] [Hour] [Day] [Month] [Day of week (0 =sunday to 6 =saturday)] [Command]

您可以阅读更多关于this here的内容。

答案 3 :(得分:1)

在linux / ubuntu终端中输入以下内容

 crontab -e 

选择一个编辑器(有时会要求编辑) 并且每分钟运行

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null

答案 4 :(得分:1)

$command = "php ".CRON_PATH.php ";
if(substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $command, "r"));
}else{
shell_exec($command ." > /dev/null &");
}

答案 5 :(得分:0)

像这样创建一个cronjob来处理每一分钟

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null

答案 6 :(得分:0)

为什么你不使用卷曲? 从逻辑上讲,如果你执行php文件,你将在你的浏览器上通过url执行它。 如果你运行curl它非常简单

while(true)
{
    sleep(60); // sleep for 60 sec = 1 minute

    $s = curl_init();
    curl_setopt($s,CURLOPT_URL, $your_php_url_to_cron); 
    curl_exec($s); 
    curl_getinfo($s,CURLINFO_HTTP_CODE); 
    curl_close($s);
}

答案 7 :(得分:0)

首先使用用户名和密码打开SSH服务器,然后更改为默认的root用户(具有所有权限的用户),然后执行以下步骤,

  1. 输入命令crontab -e,现在您将看到列表 所有cronjobs。
  2. 输入min hr dayofmonth month dayofweek pathtocronjobfile包含所有cron作业的文件将是 打开。
  3. 使用cronjob计划将文件编辑为crontab: installing new crontab,然后保存文件。
  4. 现在您将看到一个回复​​{{1}},现在再次检查您的cron作业将是cronjobs的列表 在那里列出。

答案 8 :(得分:0)

如果您不托管自己的内容,则可能取决于您的虚拟主机。如果您的虚拟主机支持创建同步作业,则它们可能具有一个供您填写的表格,可让您选择频率并输入要执行的文件的绝对路径。例如,我的Web主机(DreamHost)允许我通过输入文件的绝对路径并从选择菜单中选择频率来创建自定义cron作业。对于您的服务器而言,这可能是不可能的,在这种情况下,您需要直接编辑crontab或通过特定于主机的方法进行编辑。

就像上面的Alister Bulman一样,创建一个PHP文件以使用CLI运行(确保在文件的开始处在#!/usr/bin/env php标记之前包含<?php。这确保了shell知道在运行脚本时应调用哪个可执行文件。

答案 9 :(得分:0)

最好将项目Cron与Linux cronjob结合使用以完成此任务。它使您可以在PHP代码中配置运行时间,支持后台作业,并且易于使用。

第一步,每分钟调用一个PHP脚本:

* * * * * /usr/local/bin/run.php &> /dev/null

第二步,使用cron/cron软件包直接在PHP中配置运行时间。

$deprecatedStatus = new ShellJob();
$deprecatedStatus->setCommand('cd /app && /usr/local/bin/php cron/updateDeprecatedStatus.php');
$deprecatedStatus->setSchedule(new CrontabSchedule('* * * * */2'));


$displayDate = new ShellJob();
$displayDate->setCommand('cd /app && /usr/local/bin/php cron/updateDisplayDate.php');
$displayDate->setSchedule(new CrontabSchedule('* * * * */5'));

您在链接的存储库中找到了详细的使用方法。

答案 10 :(得分:-1)

function _cron_exe($schedules) {
        if ($obj->get_option('cronenabledisable') == "yes") {
            // $interval = 1*20;
            $interval = $obj->get_option('cronhowtime');
            if ($obj->get_option('crontiming') == 'minutes') {
                $interval = $interval * 60;
            } else if ($obj->get_option('crontiming') == 'hours') {
                $interval = $interval * 3600;
            } else if ($obj->get_option('crontiming') == 'days') {
                $interval = $interval * 86400;
            }
            $schedules['hourlys'] = array(
                'interval' => $interval,
                'display' => 'cronjob'
            );
            return $schedules;
        }

}

答案 11 :(得分:-1)

有一种简单的方法可以解决这个问题:你可以每隔1分钟由cron执行一次php文件,并在php可执行文件里面生成“if”语句,当时间“现在”就像这样执行

<?/** suppose we have 1 hour and 1 minute inteval 01:01 */

$interval_source = "01:01";
$time_now = strtotime( "now" ) / 60;
$interval = substr($interval_source,0,2) * 60 + substr($interval_source,3,2);


if( $time_now % $interval == 0){
/** do cronjob */
}