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


Answers

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

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

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

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

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

Question

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

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

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

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

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




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

/usr/local/bin/php -q /home/yoursite/public_html/yourfile.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 - это решение общего назначения для задач планирования. Но когда вы идете побольше, а графики идут с высокой частотой, могут быть проблемы с надежностью / перекрытием. Если вы видите такие проблемы, подумайте над надзором или более сложным монитом .




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




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

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