如何使用 PHP 创建 cron 作业?

Posted

技术标签:

【中文标题】如何使用 PHP 创建 cron 作业?【英文标题】:How to create cron job using PHP? 【发布时间】:2013-09-15 06:06:24 【问题描述】:

我是使用 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");

?>

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

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

【问题讨论】:

你有服务器上的shell访问权限吗? 您不能只是回显 *** 并期望创建一个 cronjob。在此处阅读如何创建 cronjobs(假设您在运行 linux 的服务器上)thesitewizard.com/general/set-cron-job.shtml @Dagon:我不知道。我去看看。 这是一次性活动,所以请使用crontab 【参考方案1】:

创建一个这样的 cronjob 以每分钟工作一次

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

【讨论】:

我认为我们正在寻找使用 php 而不是使用任何终端或 cpanel 创建 cronjob 的解决方案。我也想仅使用 php 找到此解决方案。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

星号代表(*表示本单元中的每一个):

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

您可以阅读更多关于this here 的信息。

【讨论】:

【参考方案4】:

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

 crontab -e 

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

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

【讨论】:

【参考方案5】:

这是迄今为止我发现的最好的 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

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

    如果要手动输入/编辑,cronjob 的格式是什么。 如何使用带有 SSH2 库的 PHP 来验证您要编辑哪个 crontab 的用户。 完整的 PHP 类,包含用于身份验证、编辑和删除 crontab 条目的所有必要方法。

【讨论】:

这个答案提供了链接,但它本身并没有解释“如何使用 PHP 创建 cron 作业”。【参考方案6】:
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;
        


【讨论】:

【参考方案7】:

有一个简单的方法可以解决这个问题:你可以通过cron每1分钟执行一次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 */

【讨论】:

【参考方案8】:

为什么不使用 curl? 从逻辑上讲,如果您执行 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);

【讨论】:

这在理论上可行,但 php 脚本必须一直运行,这不是一件好事。 您必须将 php-max-execution-time 设置为 0 才能永远运行它。此外,如果您的脚本发生错误,它不会再次执行,直到您手动重新启动它。【参考方案9】:

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

【讨论】:

我对你的代码很感兴趣,你能解释一下吗?【参考方案10】:

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

    输入命令crontab -l现在你会看到列表 所有 cronjobs。 输入 crontab -e 包含所有 cron 作业的文件将是 已打开。 使用min hr dayofmonth month dayofweek pathtocronjobfile 的 cronjob 计划编辑文件并保存文件。 现在您将看到回复 crontab: installing new crontab 现在再次检查您的 cron 作业将是的 cronjobs 列表 列在那里。

【讨论】:

【参考方案11】:

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

正如上面Alister Bulman 的详细信息,创建一个PHP 文件以使用CLI 运行(确保在文件的最开始处包含#!/usr/bin/env php,在&lt;?php 标记之前。这样可以确保shell 知道应该是哪个可执行文件运行脚本时调用。

【讨论】:

【参考方案12】:

最好将项目 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'));

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

【讨论】:

以上是关于如何使用 PHP 创建 cron 作业?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 cron 作业执行(如果它已经在运行)

如何使用 php 中的 cron 作业自动删除 mysql 行?

如何使用CRON作业在Joomla DB上运行此查询?

如何以编程方式设置 Cron 作业?

windows - 如何停止 .bat 文件的 cron 作业?

如何在共享主机中为 Lumen 应用程序设置 cron 作业(使用 CPanel)?