Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Назовите этот script "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

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

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

Ответ 6

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

Нижняя сторона (в порядке, одна из нижних сторон) заключается в том, что если никто не использует приложение в течение определенного периода времени, то script не будет работать.

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

Сначала некоторые cronjob могут быть заменены. Например, если у вас есть счетчик количества зарегистрированных пользователей на вашем сайте, вы можете просто обновить этот номер, когда пользователь регистрируется, поэтому вам не нужно использовать 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
}

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

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

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