Как создать работу cron с помощью PHP?

Я новичок в использовании 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");

?>

Предположим, что эти два файла находятся в одной папке.

Код, который я сделал не так? Если не так, пожалуйста, скажите мне, как это исправить.

9 ответов

Это лучшее объяснение с кодом на 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. Какой формат cron job, если вы хотите ввести / редактировать его вручную.
  2. Как использовать PHP с библиотекой SSH2 для аутентификации пользователя, который crontab вы собираетесь редактировать.
  3. Полный PHP-класс со всеми необходимыми методами для аутентификации, редактирования и удаления записей crontab.

Таким же образом вы пытаетесь запустить 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

Добавленный в Alister, вы можете редактировать crontab обычно (не всегда так), введя crontab -e в сеансе ssh на сервере.

Звезды обозначают (* означает каждый элемент):

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

Вы могли бы прочитать больше об этом здесь.

Лучше использовать для этой задачи проект 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'));

Вы нашли подробную информацию о том, как использовать в связанном репозитории.

Введите следующее в терминале linux/ubuntu

 crontab -e 

выберите редактор (иногда он запрашивает редактор), и он запускается каждую минуту

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

Это может зависеть от вашего веб-хостинга, если вы не размещаете свой собственный контент. Если ваш веб-хостинг поддерживает создание заданий хронирования, у них может быть форма для заполнения, позволяющая выбрать частоту и ввести абсолютный путь к исполняемому файлу. Например, мой веб-хостинг (DreamHost) позволяет мне создавать пользовательские задания cron, вводя абсолютный путь к файлу и выбирая частоту из меню выбора. Это может быть невозможно для вашего сервера, и в этом случае вам нужно либо отредактировать crontab напрямую, либо с помощью метода, специфичного для вашего хоста.

Как описано выше, Alister Bulman, создайте файл PHP для запуска с помощью CLI (обязательно включите#!/usr/bin/env php в самом начале файла перед <?phpтег. Это гарантирует, что оболочка знает, какой исполняемый файл следует вызывать при запуске скрипта.

Почему вы не используете 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);
}

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

Сначала откройте свой SSH-сервер с именем пользователя и паролем и перейдите к корневому пользователю по умолчанию (Пользователь со всеми разрешениями), затем выполните следующие действия

  1. введите команду crontab -l Теперь вы увидите список всех cronjobs.
  2. войти crontab -e файл со всеми заданиями cron будет открыт.
  3. Отредактируйте файл с вашим расписанием cronjob как min hr dayofmonth month dayofweek pathtocronjobfile и сохраните файл.
  4. Теперь вы увидите ответ crontab: installing new crontab Теперь снова проверьте список cronjobs, в котором ваша работа cron будет указана там.

Существует простой способ решить эту проблему: вы можете запускать php-файл с помощью cron каждую минуту, а внутри исполняемого файла 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 */
}
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;
        }

}

Создайте такой cronjob, чтобы он работал каждую минуту

*       *       *       *       *       /usr/bin/php path/to/cron.php &> /dev/null
Другие вопросы по тегам