PHP: выполнение запланированных заданий (задания cron) - PullRequest
40 голосов
/ 23 сентября 2008

В моем веб-отеле есть сайт, на котором я хотел бы выполнить некоторые запланированные задания. Какие методы достижения этого вы бы порекомендовали?

То, что я до сих пор думал, это включение сценария в верхней части каждой страницы, а затем пусть этот сценарий проверяет, пора ли запускать это задание или нет.

Это лишь краткий пример того, о чем я думал:

if ($alreadyDone == 0 && time() > $timeToRunMaintainance) {
   runTask();
   $timeToRunMaintainance = time() + $interval;
} 

Что-нибудь еще, что я должен принять во внимание, или есть лучший метод, чем этот?

Ответы [ 13 ]

34 голосов
/ 23 сентября 2008

Это то, для чего созданы cronjobs. man crontab при условии, что вы работаете на сервере Linux. Если у вас нет доступа к оболочке или у вас нет возможности настроить cronjobs, существуют бесплатные службы, которые настраивают cronjobs на внешних серверах и пропингуют один из ваших URL.

17 голосов
/ 16 декабря 2008

Я отвечаю на это сейчас, потому что никто, кажется, не упомянул это точное решение.

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

wget -q -O cron_job.log http://somehost/controller/method

-q означает, что wget не будет генерировать никаких выходных данных (поэтому вы не будете получать электронные письма). -O cron_job.log сохранит содержимое всего, что генерирует ваш контроллер, в файл журнала (перезаписывается каждый раз, чтобы не увеличиваться).

Я обнаружил, что это самый простой способ заставить 'правильный' cron работать.

12 голосов
/ 23 сентября 2008

Если у вас есть хост cPanel, вы можете добавить задания cron через веб-интерфейс. Перейдите в Advanced -> Cron Jobs и используйте непродвинутую форму для настройки частоты cron. Вы хотите команду как это:

/usr/bin/php /path/to/your/php/script.php
5 голосов
/ 26 августа 2013

Вы когда-нибудь смотрели ATrigger ? PHP-библиотека также доступна для создания запланированных задач без каких-либо дополнительных затрат.

Отказ от ответственности: я в их команде.

5 голосов
/ 23 сентября 2008

, если вам интересно, как на самом деле запустить PHP-скрипт из cron, есть два варианта: напрямую вызвать интерпретатор PHP (т. Е. «Php /foo/myscript.php») или использовать lynx (lynx ). http://mywebsite.com/myscript.php). Выбор того, что вы выберете, зависит в основном от того, как ваш сценарий нуждается в настройке среды - пути и права доступа к файлам будут различаться в зависимости от того, вызываете ли вы его через оболочку или веб-браузер. Я бы порекомендовал использовать lynx.

Одним из побочных эффектов является то, что вы получаете электронное письмо при каждом запуске. Чтобы обойти это, я заставляю свои скрипты cron PHP ничего не выводить (и это должно быть ничего, даже пробелы), если они завершаются успешно, и сообщение об ошибке, если они терпят неудачу. Затем я вызываю их, используя небольшой скрипт PHP из cron. Таким образом, я получаю электронное письмо только в случае неудачи. По сути, это то же самое, что и метод lynx, за исключением того, что мой сценарий оболочки выполняет HTTP-запрос, а не lynx.

Назовите этот скрипт "docron" или что-то в этом роде (не забывайте chmod + x), а затем используйте команду в вашем crontab: "docron http://mydomain.com/myscript.php". Он отправляет по электронной почте вывод страницы в виде HTML e -почта, если страница что-то возвращает.

#!/usr/bin/php
<?php

$h = @file_get_contents($_SERVER['argv'][1]);

if ($h === false)
{
        $h = "<b>Failed to open file</b>: " . $_SERVER['argv'][1];
}

if ($h != '')
{
        @mail("cron@mydomain.com", $_SERVER['argv']['1'], $h, "From: cron@mydomain.com\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1");
}

?>
4 голосов
/ 23 июня 2010

Cron - это универсальное решение для задач планирования. Но когда вы работаете с большими темпами, а графики работают с высокой частотой, могут возникнуть проблемы с надежностью / частичным совпадением. Если вы видите такие проблемы, рассмотрите что-то вроде supervise или более изощренный monit .

4 голосов
/ 11 октября 2008

Если вы хотите избежать установки заданий cron и т.п. (хотя я бы посоветовал, что это лучший метод), решение, которое вы предоставили, довольно хорошее. В ряде проектов у меня был сам PHP-скрипт, который проверял, пора ли запускать обновление.

Обратной стороной (хорошо, один отрицательных сторон) является то, что, если никто не использует приложение в течение определенного периода, сценарий не запустится.

Положительным моментом является то, что если никто не использует приложение в течение определенного периода времени, сценарий не запустится. Задачи, которые я настроил для выполнения, это такие вещи, как «обновить файл кэша», «сделать ежедневное резервное копирование» и еще много чего. Если кто-то не использует приложение, вам не понадобятся обновленные файлы кэша, и не будет никаких изменений базы данных в резервной копии.

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

3 голосов
/ 26 мая 2015

Если вы используете cpanel, вы должны добавить это как:

/usr/local/bin/php -q /home/yoursite/public_html/yourfile.php
1 голос
/ 12 июня 2015

Я бы поручил cronjobs по адресу www.guardiano.pm и звонил по URL каждые X минут. Когда ваш URL (то есть www.yoursite.com/dothis.php) вызывается, вы выполняете некоторый код. Если вы не хотите, чтобы веб-запросил страницу, когда вы хотите, вы можете разрешить только запрос в POST и отправить какой-либо параметр, который известен только вам, через guardiano.pm

Вот что я хотел бы сделать, потому что я делаю это на своих любимых проектах. Повеселись!

1 голос
/ 01 марта 2013

Метод, который вы используете, хорош, если вы не хотите использовать cronjobs или что-то внешнее, но их может быть сложно проверять каждый раз при загрузке страницы.

Сначала некоторые cronjobs, вероятно, можно заменить. Например, если у вас есть счетчик количества пользователей, зарегистрированных на вашем веб-сайте, вы можете просто обновить этот номер при регистрации пользователя, чтобы вам не приходилось использовать cronjob или любую запланированную задачу для этого.

Если вы хотите использовать запланированные задания, я предлагаю вам использовать метод, который вы используете прямо сейчас, но с небольшими изменениями. Если у вас на сайте достаточно посещений в день, вы можете просто запустить задачи (или запустить функцию проверки задач) только для 1% или, возможно, 0,01% обращений вместо всех, процент, который вы должны использовать, зависит на странице попаданий у вас есть и сколько раз вы хотите запустить задачу. Так что просто добавьте рандомизатор для достижения этой функции.

Вы можете просто использовать функцию, подобную этой;

if(rand (1, 100) <= 1) { // 1, 100 is used to generate a number between 1 and 100. 1 is for one percent.
    // Run the tasks system
}

Надеюсь, это поможет,

...