如何使用PHP创建cron作业?


100

我是使用cron工作的新手。我什至不知道怎么写。我曾尝试从互联网搜索,但我仍然不太了解。我想创建一个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");

?>

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

我做错的代码是吗?如果有误,请告诉我如何解决。


您在服务器上具有外壳程序访问权限吗?

8
您不能仅仅回荡***并期望创建一个cronjob。在此处阅读如何创建cronjobs(假设您在运行linux的服务器上)thesitewizard.com/general/set-cron-job.shtml
tlenss 2013年

@Dagon:我对此一无所知。我会检查一下。
user2738520 2013年

这是一次一次性活动,请使用crontab
Ed Heal 2014年

Answers:


66

这是到目前为止我发现的PHP代码的最佳解释:

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

简而言之:

尽管乍看之下安排新工作的语法似乎让人望而生畏,但将其分解后,实际上相对容易理解。cron作业将始终有五列,每列代表一个按时间顺序排列的“操作员”,后跟完整的路径和要执行的命令:

* * * * * 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.

在此处输入图片说明

因此,例如,如果要在每个月的第一天将任务安排在凌晨12点,它将看起来像这样:

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条目的所有必要方法。

34

以您尝试运行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

11

添加到Alister后,通常可以(在并非总是如此)编辑crontab,方法是在服务器上的ssh会话中输入crontab -e。

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

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

您可以在此处阅读更多有关此内容的信息


2

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

 crontab -e 

选择一个编辑器(有时会要求编辑器),然后每分钟运行一次

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

1

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

正如上面的Alister Bulman所详述的那样,创建一个PHP文件以使用CLI运行(确保#!/usr/bin/env php在文件的开始处在<?php标记之前包含该文件。这可确保外壳程序知道运行脚本时应调用哪个可执行文件。


0

为什么不使用卷发?从逻辑上讲,如果您执行php文件,则将在浏览器中通过url执行该文件。如果您卷曲就很简单

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);
}

5
从理论上讲,这是可行的,但是php-script必须一直运行,这不是一件好事。
bestprogrammerintheworld,

1
您必须将php-max-execution-time设置为0才能永久运行。另外,如果脚本中发生某些错误,它将不会再次执行,直到您手动重新启动它为止。
哈桑·拉扎

0

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


6
我对您的代码非常感兴趣,您能解释一下吗?
珍贵的汤姆,

0

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

  1. crontab -l现在输入命令,您将看到所有cronjobs的列表。
  2. 输入crontab -e所有cron作业的文件将被打开。
  3. 使用cronjob时间表编辑文件,min hr dayofmonth month dayofweek pathtocronjobfile然后保存文件。
  4. 现在您将看到一个响应,crontab: installing new crontab现在再次检查cronjobs列表,您的cron任务将在此处列出。

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'));

您在链接的存储库中找到了如何使用的详细信息。


-1

像这样创建一个cronjob,每分钟都可以工作

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

4
我认为我们正在寻找使用php而不使用任何终端或cpanel创建cronjob的解决方案。我也想仅使用php查找此解决方案。
user3264863'Aug 11'16

-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 */
}

4
这仅在您加载页面时有效,基本上这不是解决方案!
MD。Atiqur Ra​​hman

如果我关闭浏览器怎么办?这失败了!
Resheil Agarwal,

-2
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;
        }

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.