Запуск скрипта без CRON или CRON для бедных
Сегодня пост будет коротким и практичным.
Дело в том, что разработчику часто требуется вызывать небольшие скрипты с определённой периодичностью. Например, нужно пересчитать статистику. А иногда и большие процессы необходимо запускать. На заднем плане. Так, чтоб пользователь их не видел.
В тоже время некоторые дешёвые хостинги, как это ни странно, не поддерживают элементарной функции – планировщика задач. А ведь без CRON'а никуда. Конечно выход есть и мы о нём сегодня поговорим.
Есть конечно и специальные онлайн сервисы, предоставляющие услуги аналогичные CRON, но я бы не стал на них полагаться.
Для того, чтобы имитировать CRON, нам нужен механизм отсчёта времени и механизм пингования.
Отсчитываем время от прошлого пинга
Нам придётся писать время пинга в текстовый файл и каждый раз оттуда его считывать. Далее нужно сравнить его с нужный интервалом и перезаписать, если пришло время запуска скрипта.
Ниже я набросал примерчик, в котором скрипт запускается с периодичность в 12 часов. Он читает время прошлого пинга из файла, сравнивает с нынешним временем за минусом двенадцати часов (60 * 60 * 12) и записывает новое время, если прошлый раз скрипт запускался более 12 часов назад.
$period = time() - 60 * 60 * 12;
if ($last_cron_time < $period)
{
/* Механизм пингования */
$open_cron_file = fopen('cron.txt', 'w');
$line_content = time();
fwrite($open_cron_file, $line_content);
fclose($open_cron_file);
}
Здесь всё до безобразия просто. Поэтому перейдём к следующей задаче.
Запускаем нужный скрипт
Если скрипт небольшой, то его можно вообще подключить с помощью include или require. Однако это совсем не правильно. Тогда второй скрипт будет выполняться «внутри» первого.
Есть такой же простой, но более правильный метод. Банально выполнить функцию file_get_contents. Однако минус в том, что нам придётся ждать выполнения вызываемого скрипта. Ни смотря ни на что, вот такая конструкция будет совершенно нормально работать.
$period = time() - 60 * 60 * 12;
if ($last_cron_time < $period)
{
file_get_contents("http://site.ru/script.php");
$open_cron_file = fopen('cron.txt', 'w');
$line_content = time();
fwrite($open_cron_file, $line_content);
fclose($open_cron_file);
}
Более правильный вариант подсказал Владимир. За что ему честь, хвала и ссылочка. А новый вариант, с учётом PHP 5+, указан ниже.
$period = time() - 60 * 60 * 12;
if ($last_cron_time < $period)
{
file_get_contents("http://site.ru/script.php");
file_put_contents("cron.txt", time());
}
Если скрипт большой и выполняется не мгновенно, то намного правильней дёрнуть файл с помощью GET запроса. В этом помогут библиотека CURL или функция fsockopen.
Однако не все разберутся, как ими пользоваться. Начинающему будет довольно сложно. Но не стоит отчаиваться. Есть способы и проще.
Например, можно вывести в теле HTML кода небольшой фрейм.
</div>
Последний вариант подсмотрен у Мастера Ласто. Он же написал и небольшой скрипт для массового пингования. Работает не в зависимости от времени, а наоборот хаотично. Ибо писан специально для любителей сплогов.
Главный месседж данной статьи в том, что решений любой проблемы существует множество. И многие из них чрезвычайно просты и банальны. Так почему же ими не пользоваться?
Обмен ссылками
Набрёл на сравнительно молодой и не очень популярный «Блог начинающего вебмастера». Автор заявляет, что вы найдёте там всё для вебмастера. Не знаю на счёт всего, но статьи на блоге в основном о web разработке, а не о всяких ТИЦах. Что несомненно радует. Основные темы блога: Ajax, HTML+CSS, Jquery, Mysql, PHP.
Поделиться ссылкой:
Комментарии:
Во первых можно легко найти дешевый хостинг с поддержкой крона, во вторых далеко не всем он нужен ))
Планировщик задач сейчас есть даже на дешевых хостингах. Но я обхожусь без него вообще, хотя и не считаю себя начинающим юзером. Просто не вижу в нем большой необходимости. А статистику ты прав можно и на онлайн сервисе глянуть.
Что бы не говорили, крон - очень важная и незаменимая вещь. Конечно, он не всегда применим. К примеру для одного моего сайта задания выполняются ежедневно по несколько десятков раз (не знаю, как бы я без него обходился), на другом он вообще не нужен. Все зависит от целей и задач самого сайта.
Извиняюсь, в абзаце про обмен ссылками на данной страничке:«Не знаю на счёт всего, но статьи на блоге в основном о web разработке, а не о всяких ТИЦах.»- это не про страничку salsk-online.ru/?p=324 у меня? Или таких «пруд пруди»?
Вроде я просматриваю- все в норме. И насчёт обмена ссылками, зашёл бы да и написал бы к чему-нить комментарий, я то ссылки режу редко. Всем успехов, а я пошёл на РАБоту, начался летний график на Ж/Д, поездов с отпускниками--тьма, мож кого-нить из присутствующих и здесь бывающих, и я до морей прокачу?
Ещё раз извиняюсь, да была моя описка - salsk-online.ru/?p=342 так будет правильно, уже весь мыслями в РАБоте, звиняйте. Глянь, черкни что думаешь.
Давно я не встречал хостингов без крона, совсем они нищие что ли. :-)
Эх, блин немного раньше бы эту тему. Я из-за этого CRONа на другой хостинг переехал, не все хостинги содержат планировщики задач, что иногда очень усложняет задачу.
У меня вопрос: Если купить VPS, туда можно поставить КРОН вручную?
О, круто. Я просто хочу на VPS переехать. Т.к. как мой хостер ели выдерживает меня. Всего лишь 8 мб дали на мой Вордпресс((
За второй вариант запуска скрипта спасибо! А то как то тяжелые скрипты приходилось запускать только через крон. Мелочь то понятно что и через инклуд без напрягов на пинг работают.
Автор конечно прав в том, что многое зависит от выбора хостинга.
Чем больше возможностей (планировщик я считаю как минимум), тем проще работать впоследствии.
Благодарю за нужные скрипты, спасибо гуглу и Вашему блогу - я их нашел!
Спасибо за информацию очень полезная и поучительная, но хотелось бы по-больше информации о том как продвинуть сайт на бесплатном хостинге. Пример на ucoz.
Спасибо. Я пока еще только осваиваю азы владения PHP, думаю ваш блог мне в этом поможет.
спасибо за информацию- только приступила к освоению, теперь буду знать более подробно.
К чему такие извращения? Вроде никто пока не отменял сервисов аля cronjobs.cc, setcronjob.com etc.
Механизм, действительно прост! А как будет запускаться сам скрипт крона? Или он запускается пользователем?
Интересный вариант, спасибо! Есть еще веб-сервисы для этого, но не пользовалс я ими.
Прочитав статью, вспомнил, как решал аналогичную задачу...
www.levik.info/php-cron-without-cron.htm
Идея та же - посетитель инициирует проверку.. если нужно выполнять - запускаем «выполнялку». По реализации отличия были. Из принципиального - разрывал соединение с браузером, чтоб «не висело», а скрипт себе тихонечко дорабатывал...
ps. всё, что после ссылки - вырезает, если писать с http... вроде где-то читал, что ссылки корректно определяться должны :)
полезная статейка, давно искал такую вещь, вот в итоге нашел. спасибо админу за интересный пост. особенно понравилас идея владимира, респект ему!!! в общем полезный у вас блог вышел продолжайте в том же духе
Есть специальные внешние сервисы крона для бедных. Ссылки ниже.
www.setcronjob.com/cp
www.webcron.org/
Хм, странно. Все мои знакомые начинали с бесплатных забугорных хостов... И там, кстати, есть крон... :)
По моему скрипт будет грузить систему...
(ему ведь всегда нужно будет выполнять условие проверки)
Ну так это «те же яйца».
Когда страница с таким кодом открывается в браузере, то скрипт сравнивает время.
Если время устраивает условия, то запускается «что повесим».
Если время не устраивает, то ничего.
Если в нужное время никто не зайдёт? Что же тогда???
есть некоторые задачи, которые на странице напрямую не видны, но выполнять их надо. например, рассылка рассылок, забор почты с внешних ящиков, очистка базы данных и тому подобное. если никто не зайдет, то эти задания и не будут выполнены. хотелось бы более раскрытия темы о том, почему нет доверия сторонним сервисам crontab?
Never Lex, хотелось бы более раскрытия темы о том, почему нет доверия сторонним сервисам crontab?
Людям нравиться делать велосипеды, пускай развлекаются =)
С времени написания поста прошло много времени. Технологии развиваются. Например 10 Cron задач на аккаунт дает бесплатный хостинг 100ms.ru (как видите, русский) зачем действительно изобретать велосипед?
$line_content = time();
fwrite($open_cron_file, $line_content);
fclose($open_cron_file);
равносильно