109

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

?>

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

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

4

12 回答 12

74

这是迄今为止我发现的 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. 如何使用带有 SSH2 库的 PHP 以用户身份进行身份验证,您将编辑哪个 crontab。
  3. 完整的 PHP 类,具有用于身份验证、编辑和删除 crontab 条目的所有必要方法。
于 2014-07-08T06:32:54.417 回答
38

以您尝试运行 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
于 2013-09-11T09:37:10.790 回答
12

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

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

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

您可以在此处阅读更多相关信息。

于 2013-09-11T09:47:56.287 回答
4

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

 crontab -e 

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

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
于 2014-04-09T05:08:05.773 回答
2

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

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

于 2020-07-02T10:08:51.940 回答
1

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

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

于 2019-12-04T22:58:06.430 回答
0

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

  1. 现在输入命令crontab -l,您将看到所有 cronjobs 的列表。
  2. 输入crontab -e一个包含所有 cron 作业的文件将被打开。
  3. 使用您的 cronjob 计划编辑该文件min hr dayofmonth month dayofweek pathtocronjobfile并保存该文件。
  4. 现在您将看到一个响应crontab: installing new crontab,再次检查您的 cron 作业将在那里列出的 cronjobs 列表。
于 2019-03-06T18:33:50.393 回答
-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 &");
}

于 2018-02-05T07:04:53.173 回答
-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 */
}
于 2016-03-11T08:25:16.650 回答
-2

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

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
于 2013-09-11T09:33:42.183 回答
-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;
        }

}
于 2015-01-14T06:00:17.997 回答
-2

为什么你不使用卷曲?从逻辑上讲,如果您执行 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);
}
于 2017-11-01T17:25:15.603 回答