Запуск скрипта без CRON или CRON для бедных

Сегодня пост будет коротким и практичным.

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

В тоже время некоторые дешёвые хостинги, как это ни странно, не поддерживают элементарной функции – планировщика задач. А ведь без CRON'а никуда. Конечно выход есть и мы о нём сегодня поговорим.

Есть конечно и специальные онлайн сервисы, предоставляющие услуги аналогичные CRON, но я бы не стал на них полагаться.

Для того, чтобы имитировать CRON, нам нужен механизм отсчёта времени и механизм пингования.

Отсчитываем время от прошлого пинга

Нам придётся писать время пинга в текстовый файл и каждый раз оттуда его считывать. Далее нужно сравнить его с нужный интервалом и перезаписать, если пришло время запуска скрипта.

Ниже я набросал примерчик, в котором скрипт запускается с периодичность в 12 часов. Он читает время прошлого пинга из файла, сравнивает с нынешним временем за минусом двенадцати часов (60 * 60 * 12) и записывает новое время, если прошлый раз скрипт запускался более 12 часов назад.

$last_cron_time = file_get_contents("cron.txt");
$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. Однако минус в том, что нам придётся ждать выполнения вызываемого скрипта. Ни смотря ни на что, вот такая конструкция будет совершенно нормально работать.

$last_cron_time = file_get_contents("cron.txt");
$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+, указан ниже.

$last_cron_time = file_get_contents("cron.txt");
$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 style="position:absolute;left:1%;width:0%;top:1%;height:0%;">       <script>document.write("<iframe src="http://site.ru/script.php"></iframe>");</script>
</div>

Последний вариант подсмотрен у Мастера Ласто. Он же написал и небольшой скрипт для массового пингования. Работает не в зависимости от времени, а наоборот хаотично. Ибо писан специально для любителей сплогов.

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

Обмен ссылками

Набрёл на сравнительно молодой и не очень популярный «Блог начинающего вебмастера». Автор заявляет, что вы найдёте там всё для вебмастера. Не знаю на счёт всего, но статьи на блоге в основном о web разработке, а не о всяких ТИЦах. Что несомненно радует. Основные темы блога: Ajax, HTML+CSS, Jquery, Mysql, PHP.

Подпишитесь на обновления блога

Получить в подарок мини-книги и 21-дневный тренинг по личностному росту.

Подписаться на рассылку «Инструменты Интернет для онлайн бизнеса»

Поделиться ссылкой:


Комментарии:

09.06.2010 14:38:10
$open_cron_file = fopen('cron.txt', 'w');
$line_content = time();
fwrite($open_cron_file, $line_content);
fclose($open_cron_file);

равносильно

file_put_contents ('cron.txt', time()); // пхп 5+
09.06.2010 17:03:51

Владимир, спасибо. Я пока только учусь PHP :)

Но в четвёртой версии по другому вроде нельзя.

09.06.2010 17:04:50
#3 regkat

Спасибо взял себе

10.06.2010 05:31:08
#4 Anna

Спасибо за информацию!

10.06.2010 08:57:39

Во первых можно легко найти дешевый хостинг с поддержкой крона, во вторых далеко не всем он нужен ))

10.06.2010 09:01:08

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

10.06.2010 12:12:15
#7 1

Спасибо! Воспользуюсь!)

10.06.2010 12:42:48

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

10.06.2010 13:01:21

Вик, этот пост появился только потому, что недавно я столкнулся с данной проблемой. Например, нужно каждый день подтягивать курсы валют и записывать их в базу, а CRON’а нет.

10.06.2010 18:32:38
#10 Смоленск

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

11.06.2010 11:26:07
#11 Сергей

Извиняюсь, в абзаце про обмен ссылками на данной страничке:«Не знаю на счёт всего, но статьи на блоге в основном о web разработке, а не о всяких ТИЦах.»- это не про страничку salsk-online.ru/?p=324 у меня? Или таких «пруд пруди»?

11.06.2010 11:29:52

Сергей, нет. Это не о вашей страничке. Тем более, что она выдаёт 404 ошибку.

11.06.2010 11:38:34
#13 Сергей

Вроде я просматриваю- все в норме. И насчёт обмена ссылками, зашёл бы да и написал бы к чему-нить комментарий, я то ссылки режу редко. Всем успехов, а я пошёл на РАБоту, начался летний график на Ж/Д, поездов с отпускниками--тьма, мож кого-нить из присутствующих и здесь бывающих, и я до морей прокачу?

11.06.2010 11:44:49
#14 Сергей

Ещё раз извиняюсь, да была моя описка - salsk-online.ru/?p=342 так будет правильно, уже весь мыслями в РАБоте, звиняйте. Глянь, черкни что думаешь.

11.06.2010 17:51:15

Давно я не встречал хостингов без крона, совсем они нищие что ли. :-)

11.06.2010 19:59:09
#16 Бублик

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

12.06.2010 15:12:40
#17 Павел

полностью согласен с Бубликом, тоже не спел ((

13.06.2010 06:42:35

У меня вопрос: Если купить VPS, туда можно поставить КРОН вручную?

13.06.2010 07:57:01

Громит, честно говоря, я сам не админю ВДС, но уверен, что поставить CRON проще простого. Мой админ говорил, что софт на никсах ставится одной командой.

13.06.2010 10:09:05

О, круто. Я просто хочу на VPS переехать. Т.к. как мой хостер ели выдерживает меня. Всего лишь 8 мб дали на мой Вордпресс((

13.06.2010 10:11:54

Громит, 8 мб это вовсе немало. Дело в том, что ВП зло :)

15.06.2010 08:35:19

За второй вариант запуска скрипта спасибо! А то как то тяжелые скрипты приходилось запускать только через крон. Мелочь то понятно что и через инклуд без напрягов на пинг работают.

15.06.2010 12:05:02
#23 gscmihkov

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

15.06.2010 13:31:00

Полезно на бесплатных хостингах.

15.06.2010 13:54:23
#25 netbookman

Благодарю за нужные скрипты, спасибо гуглу и Вашему блогу - я их нашел!

15.06.2010 16:34:20
#26 Tanushka77

Сын засел за php, покажу ему, думаю, пригодится.

15.06.2010 17:38:41
#27 sashashoiko

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

16.06.2010 11:36:20
#28 pgk

Интересно, сейчас проверим на работоспособность и будем юзать.

16.06.2010 18:48:04
#29 Артём

Спасибо большое давно искал наконец то

16.06.2010 22:41:56

Спасибо. Я пока еще только осваиваю азы владения PHP, думаю ваш блог мне в этом поможет.

16.06.2010 23:41:50
#31 myworld

спасибо за информацию- только приступила к освоению, теперь буду знать более подробно.

17.06.2010 07:31:49
#32 маргарита

Спасибо большое для реферата статья пригодится

17.06.2010 07:54:32

Axsimen, очень в этом надеюсь. Удачи.
myworld, пожалуйста.
маргарита, ссылочку на источник поставьте :)

17.06.2010 09:14:13
#34 анонимус

Да, неплохо. Попробую!

20.06.2010 18:34:56
#35 Tamer

К чему такие извращения? Вроде никто пока не отменял сервисов аля cronjobs.cc, setcronjob.com etc.

20.06.2010 18:46:07

Tamer, конечно. И я ими тоже пользуюсь. Но честно говоря не очень доверяю. Поэтому было придумано «извращение» :)

21.06.2010 04:21:26

Механизм, действительно прост! А как будет запускаться сам скрипт крона? Или он запускается пользователем?

21.06.2010 06:37:39

Fuzaylov, конечно пользователем. Его логично вшить в основной шаблон сайта. То есть, разместить на всех страницах.

25.06.2010 18:39:20
#39 Киноблоггер

Интересный вариант, спасибо! Есть еще веб-сервисы для этого, но не пользовалс я ими.

13.07.2010 15:30:19
#40 left

Спасибо, как раз понадобилось использовать на сайте.

18.07.2010 12:18:44
#41 Михаил

Огромное спасибо за скрипт. Буду пользоваться!

18.08.2010 08:35:43
#42 Рома

Спасибо оргомное буду пробовать

20.08.2010 12:01:28

Прочитав статью, вспомнил, как решал аналогичную задачу...
www.levik.info/php-cron-without-cron.htm

Идея та же - посетитель инициирует проверку.. если нужно выполнять - запускаем «выполнялку». По реализации отличия были. Из принципиального - разрывал соединение с браузером, чтоб «не висело», а скрипт себе тихонечко дорабатывал...

ps. всё, что после ссылки - вырезает, если писать с http... вроде где-то читал, что ссылки корректно определяться должны :)

20.08.2010 14:31:23

Да, что-то в этой ссылке скрипту не понравилось. Регулярка его режет. Посмотрю.

24.08.2010 15:57:29
#45 HD

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

01.09.2010 09:28:03
#46 Seodva

Хорошая альтернатива хоть и гиморная:) Спасибо =)

23.10.2010 15:42:23

Есть специальные внешние сервисы крона для бедных. Ссылки ниже.
www.setcronjob.com/cp
www.webcron.org/

13.07.2011 18:02:30

Хм, странно. Все мои знакомые начинали с бесплатных забугорных хостов... И там, кстати, есть крон... :)

24.09.2011 06:25:03
#49 lagun4ik

По моему скрипт будет грузить систему...
(ему ведь всегда нужно будет выполнять условие проверки)

20.04.2012 16:51:44
#50 minux

Ну так это «те же яйца».

Когда страница с таким кодом открывается в браузере, то скрипт сравнивает время.
Если время устраивает условия, то запускается «что повесим».
Если время не устраивает, то ничего.
Если в нужное время никто не зайдёт? Что же тогда???

20.04.2012 19:14:11

lagun4ik, смотря какие у вас нагрузки.

minux, если никто не зайдёт, то и обновление никому не нужно :)

31.05.2012 16:01:57
#52 Юрий

Never Lex,

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

06.08.2012 14:10:25
#53 1_and_0

Never Lex, хотелось бы более раскрытия темы о том, почему нет доверия сторонним сервисам crontab?

Людям нравиться делать велосипеды, пускай развлекаются =)

06.10.2013 21:36:00
#54 Maxim-Li

С времени написания поста прошло много времени. Технологии развиваются. Например 10 Cron задач на аккаунт дает бесплатный хостинг 100ms.ru (как видите, русский) зачем действительно изобретать велосипед?

12.06.2015 13:22:52

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

12.06.2015 14:03:17

111, если ваш сайт никто не посещает, тогда конечно не заменит :)

Оставьте комментарий [форматирование]

Пожалуйста, воздержитесь от спама и идиотских высказываний. Жёсткая модерация. Ссылки закрыты атрибутом nofollow, а значит не несут пользы для продвижения!
Ссылки на всё кроме личных блогов и тематических блогов, сходных по тематике с данным, вырезаются.



Мой Telegram канал
Мой RSS фид