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

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

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

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

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

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

Related of "PHP: запуск запланированных заданий (задания cron)"

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

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

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

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

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

Я нашел, что это самый простой способ получить «правильную» работу cron.

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

 /usr/bin/php /path/to/your/php/script.php 

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

Один побочный эффект заключается в том, что вы получаете электронное письмо каждый раз, когда оно выполняется. Чтобы обойти это, я делаю, что мои скрипты PHP cron ничего не выводят (и они должны быть ничем, даже без пробелов), если они завершатся успешно, и сообщение об ошибке, если они терпят неудачу. Затем я вызываю их с помощью небольшого PHP-скрипта из cron. Таким образом, я получаю только электронное письмо, если оно терпит неудачу. Это в основном то же самое, что и метод lynx, за исключением того, что мой сценарий оболочки выполняет 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("cron@mydomain.com", $_SERVER['argv']['1'], $h, "From: cron@mydomain.com\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1"); } ?> 

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

Нижняя сторона (в порядке, одна из сторон) – это то, что если никто не использует приложение в течение определенного периода времени, сценарий не будет работать.

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

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

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

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

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

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

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

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

Во-первых, некоторые 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 } 

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

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

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

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

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

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

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

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