Як створити роботу 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
Ви не можете просто відлунюватись *** і очікувати, що буде створена крона. Прочитайте тут, як створити cronjobs (якщо ви працюєте на сервері під управлінням Linux) thesitewizard.com/general/set-cron-job.shtml
tlenss

@Dagon: я не знаю про це. Я перевірю це.
користувач2738520

Це разова подія, тому використовуйтеcrontab
Ed Heal

Відповіді:


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

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 звичайно (не завжди так), ввівши 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, вводячи абсолютний шлях до файлу та вибираючи частоту в меню вибору. Це може бути неможливим для вашого сервера, і в цьому випадку вам потрібно буде відредагувати кронтаб безпосередньо або через конкретний ваш хост метод.

Як описано вище Alister Bulman , створіть файл 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-скрипт повинен був працювати весь час, що не дуже добре.
bestprogrammerintworld world

1
Ви повинні встановити час php-max-виконання на 0, щоб це запустити назавжди. Крім того, якщо у вашому скрипті трапляється якась помилка, вона не буде виконуватися знову, поки ви не перезапустите її вручну.
Хасан Раза


0

Спочатку відкрийте свій SSH-сервер із ім’ям користувача та паролем та перейдіть на користувача root за замовчуванням (Користувач із усіма дозволами), а потім виконайте наведені нижче дії,

  1. введіть команду, crontab -lтепер ви побачите список усіх кронівок.
  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

Створіть подібну роботу, щоб працювати на кожну хвилину

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

4
Я думаю, що ми шукаємо рішення для створення cronjob за допомогою php, а не за допомогою терміналу чи cpanel. Я також хочу знайти ці рішення лише за допомогою php.
користувач3264863

-1

Існує простий спосіб вирішити це: ви можете виконувати файл php за допомогою cron кожні 1 хвилини, а всередині виконуваного файлу 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
Це буде працювати лише в тому випадку, якщо ви завантажите сторінку, в основному це не рішення!
д.м.н. Atiqur Rahman

Що робити, якщо закрити браузер? Це не вдається!
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;
        }

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.