it-swarm.com.ru

PHP: выполнение запланированных заданий (задания cron)

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

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

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

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

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

38
Eikern

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

33
Armin Ronacher

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

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

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

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

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

16
user7094

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

/usr/bin/php /path/to/your/php/script.php
12
David McLaughlin

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

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

5
Kousha

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

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

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

#!/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("[email protected]", $_SERVER['argv']['1'], $h, "From: [email protected]\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1");
}

?>
5
MrZebra

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

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

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

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

4
nickf

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

4
mixdev

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

/usr/local/bin/php -q /home/yoursite/public_html/yourfile.php
3
mokiSRB

Метод, который вы используете, хорош, если вы не хотите использовать 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
}

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

1
Tim Visée

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

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

1
Lorenzo Sinisi

Командная строка PHP + cron будет таким, как я хотел бы. Это просто и должно отвечать всем требованиям. Обычно он устанавливается с PHP как само собой разумеющееся.

0
Gavin M. Roy

Если у вас нет возможности настроить cronjob, вы можете вызвать скрипт с помощью cUrl (в качестве альтернативы wget - та же функциональность). Просто выполните запланированное задание на локальном компьютере, которое выполняет функцию cUrl.

0
meeeeeh

Если вы хотите что-то более абстрактное, вы можете использовать что-то вроде планировщика PHP. Например: 

А также, чтобы разобрать выражение cron, вы можете использовать существующую библиотеку, например https://github.com/mtdowling/cron-expression . Он предоставляет множество полезных методов, которые помогут вам выяснить информацию о работе cron.

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

0
XuDing