Как я могу заставить мою работу cron на основе PHP выполняться чаще? - PullRequest
1 голос
/ 12 апреля 2009

У меня есть файл "update.php", который выполняет некоторые операции MySQL. Задание cron выполняет этот файл каждые 5 минут. К сожалению, я не могу выполнять задание cron чаще.

Итак, у меня была идея, что я могу добавить ...

<html>
<head>
  <meta http-equiv="refresh"  content="2; URL=<?php echo $_SERVER['SCRIPT_NAME']; ?>" />
</head>
<body></body>
</html>

... на страницу "update.php". Будет ли cron выполнять файл так, чтобы страница автоматически обновлялась? Или этого не произойдет, потому что нет клиента с браузером?

Если метаобновление не имеет никакого эффекта, есть ли другая возможность добиться обновления страницы?

Заранее спасибо!

Ответы [ 6 ]

11 голосов
/ 12 апреля 2009

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

Вопрос: Почему вы не можете настроить выполнение задания cron чаще, чем каждые 5 минут?

Если другого варианта нет, вы можете создать своего собственного демона, чтобы выполнять работу чаще.

например. Ваш PHP-скрипт может:

  • Run
  • Подождите 60 секунд
  • Run
  • (Подождите; Выполнить; еще два раза)
  • выход

Например: (В зависимости от кода sshow )

<?php

$secs = 60;

ignore_user_abort(true);
set_time_limit(0);

dostuff();
sleep($secs);
dostuff();
sleep($secs);
dostuff();
sleep($secs);
dostuff();
sleep($secs);
dostuff();

?>

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

Кажется, существует некоторая путаница в том, что такое cronjob и как он запускается.

cron - это демон, который работает в фоновом режиме и запускает задачи через оболочку по расписанию, указанному в crontab s.

У каждого пользователя есть crontab, и есть системный crontab.

Crontab каждого пользователя может указывать задания, которые запускаются от имени этого пользователя.

Например:

# run five minutes after midnight, every day
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 2:15pm on the first of every month -- output mailed to paul
15 14 1 * *     $HOME/bin/monthly
# run at 10 pm on weekdays, annoy Joe
0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
5 4 * * sun     echo "run at 5 after 4 every sunday"

Итак, запускать каждые пять минут:

*/5 * * * *     echo "This will be run every five minutes"

Или бегать каждую минуту:

* * * * *       echo "This will be run every minute"

Выходные данные команд отправляются по электронной почте владельцу crontab (или в соответствии с указаниями MAILTO). Это означает, что если вы запускаете что-то каждую минуту, оно будет отправлять вам сообщения каждую минуту, если только вы не убедитесь, что все нормальные выходные данные подавлены или перенаправлены.

Команды запускаются от имени пользователя, которому принадлежит crontab, который отличается от сценариев, запускаемых веб-сервером, которые запускаются как пользователь nobody (или аналогичный - независимо от того, какой веб-сервер настроен для запуска как ). Это может усложнить жизнь, если cronjob пишет в файлы, к которым должны обращаться скрипты, запускаемые веб-сервером. По сути, вы должны убедиться, что разрешения остаются правильными.

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

Если вы хотите сделать что-то, что ваш текущий хост не позволяет вам сделать, то вместо того, чтобы взломать ограничение, вы могли бы что посмотреть на смену хостинг-провайдера?


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


Другой альтернативой является обновление по требованию формы vartec . Однако это может не решить ваших проблем.

3 голосов
/ 16 апреля 2009

Я уверен, что вы можете достичь этого, выполнив следующее:

<?php

$secs = 120;

ignore_user_abort(true);
set_time_limit(0);

while (true)
{
    // do something

    // Sleep for some time
    sleep($secs);
}

?>

Редактировать

Вам придется выполнять его один раз после каждого перезапуска сервера, если вы не сделаете это, как описывает Дуглас.

Обновление

Помните ответ Дугласа Лидера, а затем посмотрите на это:

http://www.php.net/manual/en/function.ignore-user-abort.php

2 голосов
/ 16 апреля 2009

Я бы сказал, не пытайтесь делать это с php, измените ваш crontab. Если вам нужно, чтобы ваше приложение выполняло cronjob каждую минуту, и ваш хостинг не предоставляет эту опцию, вы, скорее всего, переросли свой хостинг. Получите себе VPS-хостинг за 20 $ в месяц (Slicehost, Servergrove).

1 голос
/ 15 апреля 2009

Обновление: отредактировано на основе новой информации.

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

У вас есть пара вариантов. Они отличаются большей или меньшей ужасностью.

Лучший вариант - сменить хостов. Хороший веб-хост будет иметь полную поддержку cron. Но если вам нужно коснуться cron, честно говоря, вы все равно должны быть на хосте VPS. Многие хосты будут возражать против задачи cron, выполняемой каждую минуту, если задача просто не обновляет что-то действительно быстро и не завершается. Но хосты VPS обычно не заботятся. Slicehost предлагает VPS-серверы всего за 20 долларов в месяц. Не рекомендуется для людей, у которых никогда не было root-доступа.

Единственный доступный вариант, который будет работать с 5-минутным ограничением cronjob.de, - это создать цикл, который будет запускать итерацию, переходить в спящий режим, выполнять другую итерацию и повторяться столько раз, сколько вам нужно до конца минут. Однако у этого подхода есть две основные проблемы. Во-первых, если у вас есть запрос, который длится 4 минуты, вполне вероятно, что ваш веб-хост может убить запрос до его завершения. Во-вторых, если веб-сервер настроен неправильно, такой запрос может блокировать другие запросы, не позволяя законным пользователям получить доступ к вашему сайту - они будут стоять в очереди и будут ждать завершения запроса cronjob.de, прежде чем их запросы будут выполнены. , И так как этот запрос займет 4-5 минут, прежде чем повторяться через минуту, они могут иметь доступ к вашему сайту только раз в 5 минут. Я предполагаю, что это нежелательно. К сожалению, единственный способ узнать, столкнетесь ли вы с какой-либо из этих проблем, - это спросить своего веб-хоста. Я не рекомендую пробовать это перед тем, как спрашивать, потому что они могут не оценить его, если он неожиданно испортится и начнет влиять на других своих клиентов на сервере.

Если вам повезет, возможно, они даже захотят создать для вас работу cron.

0 голосов
/ 17 апреля 2009

Вы можете использовать PHP для вызова скрипта ...

<?php
$script='/path/to/my/php/script.php';

ignore_user_abort(1);
set_time_limit(0);
$php=exec('which php');
while (1) {
    if (file_exists($script)) { exec($php.' '.$script); }
    else { file_get_contents($script); }
    sleep(2);
}
?>

Файл, который вы даете $ script, должен существовать, иначе он считает, что это URL.

Это должно сработать.

0 голосов
/ 12 апреля 2009

То, что вы пытаетесь сделать, подразумевает взаимодействие с пользователем, так что если ни один клиент не войдет в вашу "страницу"?

Например, контейнеры сервлетов и EJB могут делать это программно при запуске контейнера, что вам нужно, поэтому я предполагаю, что для PHP единственный способ выполнить «автоматически» задания, похожие на cron, - это внести некоторые изменения в исходный код Apache, очевидно, только если Вы используете жилищный сервер.

Более практичным вариантом, не предусматривающим изменения кода, может быть какой-то скрипт cron, вызывающий непосредственно вашу страницу (wget, netcat и т. Д.), Запущенный во время запуска вашего веб-сервера

...