Как создать задание cron с помощью PHP?


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

@Dagon: я не знаю об этом. Я проверю это.
user2738520

Это разовое мероприятие, так что используйтеcrontab
Эд Хил

Ответы:


66

Это лучшее объяснение кода на PHP, которое я нашел до сих пор:

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

Коротко:

Хотя на первый взгляд синтаксис планирования нового задания может показаться сложным, на самом деле его относительно просто понять, если разбить его на части. Задание cron всегда будет иметь пять столбцов, каждый из которых представляет собой хронологический «оператор», за которым следует полный путь и команда для выполнения:

* * * * * главная / путь / к / команде / 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 * * домашний / путь / к / команде / the_command.sh

Если бы мы хотели запланировать запуск задачи каждую субботу в 8:30, мы бы написали ее следующим образом:

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

34

Таким же образом, как вы пытаетесь запустить cron.php, вы можете запустить другой скрипт PHP. Однако вам придется сделать это через интерфейс командной строки.

#!/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 обычно (не всегда), введя crontab -e в сеансе ssh на сервере.

Звезды представляют (* означает каждый из этих единиц):

[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

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

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


0

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

5
Теоретически это сработает, но php-скрипт должен будет работать все время, что не очень хорошо.
bestprogrammerintheworld

1
Вы должны установить php-max-execution-time равным 0, чтобы запускать это вечно. Также, если в вашем скрипте возникает какая-то ошибка, он не будет выполняться снова, пока вы не перезапустите его вручную.
Хасан Раза


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
Я думаю, что мы ищем решения для создания cronjob с использованием php, а не с использованием какого-либо терминала или cpanel. Я также хочу найти эти решения, используя только php.
user3264863

-1

Есть простой способ решить эту проблему: вы можете запускать 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 */
}

4
Это будет работать, только если вы загрузите страницу, в основном это не решение!
МД. Атикур Рахман

Что, если я закрою браузер? Это не удается!
Решил Агарвал

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

}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.