Comments 43
А каждую минуту (точнее выставить минимальное время вызова) выполнять скрипт кроном и смотреть прошло нужное время или нет. Т.е. скрипт запускается переодически, но это не значит, что нужное действие будет выполнено.
Крона нет. Изначально поставлено так, что крон нельзя использовать. Вообще, признаюсь, может сейчас есть другие решения, в частности, в php6 (вообще не знаком с изменениями), т.к. я делал это в декабре 10 года.
//зануда_mode=ON: PHP6 не существует и в ближайшее время не будет. Есть PHP 5.3 и разрабатывается PHP 5.4 (уже вроде как в beta)
Каюсь. Но я уточнил, что про 6 я только слышал, не вникал вообще.
Кстати, про пхп6 прочитал впервые в книге Мэтта Зандстра «PHP объекты, шаблоны и методики программирования». Не ожидал что там недостоверная информация. Сейчас ради интереса открыл книгу полистал и убедился — в начале книги пишут что пхп6 «находится на пути к нам», а далее в одном из примечаний указано, что в обеих версия пхп5 и пхп6 допустимо импользование var вместо public.
Видимо поэтому я и думал что пхп6 уже есть.
Ни о чем. Из разряда «как я реализовал вполне обычную задачу»

> вот от чего я не смог оторваться — браузер все же придется открыть, чтобы изначально запустить скрипт

Ну и двойка за исполнение. Что вам не дало просто запустить скрипт, который просто будет выполняться постоянно?

nohup /path/to/php /path/to/script.php

> Теперь надо заставить скрипт работать, не обращая внимания на максимальное время выполнения, установленное сервером

для скриптов, запущенных вручную из консоли этого ограничения нет.

> Озадачили меня тут написать демона на PHP

Статья могла бы быть крутой, если бы вы действительно описали то, как писать демона на PHP с использованием php.net/manual/en/book.pcntl.php и php.net/manual/en/book.posix.php (это то, о чем я подумал после прочтения поставновки задачи)
Консоли пхп хостинг не давал, о консоли я тогда тоже думал.

Ссылки открыл, почитаю на досуге, спасибо.
Оговорюсь, я понятия не имею какой был хостинг, делал у себя, исходя из того, что говорил заказчик.
Ну я же дописал специально «оговорюсь....»

Я делал ни сайт, ни модуль. Просто человек сказал надо сделать вот это, вот так и вот так.
Я сделал, для меня показалось необычно, я отписал.
например, agava.ru для шаред хостинга не предоставляет ssh доступ. сам с этим столкнулся. причем это ответ саппорта.
Интересный сарказм. Когда придумали SSH, у нас еще кругом пользовались фидонетом. А понятием хостинга оперировали только избранные. Но, даже тогда уже были rlogin, telnet и rsh.
Бугагашенька.
<?php
$demon_script = dirname(__FILE__).'/demon.php';
passthru("nohup /usr/bin/php $deamon_script > /dev/null &");
?>

В demon.php делаем проверку не запущен ли другой экземляр скрипта.
После прочтения вступления сложилось впечатление что заказчик нищеброд не может себе позволить хостинг поэтому будет довольствоваться бесплатными без крона. Да и еще программиста напрягает на всю ночную, надеюсь не за 2 копейки?
Думаю, проблема не в том, что не хватает денег на хостинг с кроном, ибо можно воспользоваться каким-нибудь сторонним бесплатным «кроном онлайн», коих развелось множество. Когда-то очень давно сам пользовался ни раз.
Кроется здесь что-то более загадочное…
Возможно, это бесплатный хостинг, который предоставляет провайдер, который подключает к интеренту.
Заказчик, не знающий что это такое, не говорит, что нельзя использовать passthru(), exec(); system(); и не уточняет сразу, что через крон делать нельзя.
> вот от чего я не смог оторваться — браузер все же придется открыть, чтобы изначально запустить скрипт
да ладно запустить, а как его остановить предусмотрено?
В конечном скрипте, отдаваемом заказчику предусмотрено. Здесь не описал, каюсь.
А мне понравилось. Комментирующие как-то чересчур прагматичны. При этом машина для заваривания чая всем пришлась по душе. :)
Автору респект, ему поставили задачу с условиями, и он её выполнил, научившись всему необходимому для этого. В то время, как многие ответили бы заказчику что-нибудь вроде: «купите нормальный хостинг», и даже были бы правы. ))
Я согласен, — был несколько резок — несколько лет назад я наверное что-нибудь подобное и сделал и от такого счастья, наверно, захотелось бы поделиться тем, что я поборол такую задачу. В общем, автор действительно молодец, что справился с посталенной задачей — на таких задачах скилл как раз и набивается. Думаю, в ответах на этот топик Dep3kuu найдет много информации к размышлению на тему того, как запустить PHP процесс-демон.

Вообще, конечно, нужно знать то, где будет запускаться тот софт, который пишешь, — это я бы требовал от заказчика в первую очередь. А как работать без SSH я уже забыл и вспоминать не хочу.
А доступа к system() тоже нет? А то можно было бы тупо один раз запуститься, сделать работу и в конце сделать что-нибудь в духе system("at $run_self_sh_command $some_new_random_time") — запланировать запуск самого себя в какое-то определенное время.

Я бы по крайней мере в эту сторону начал думать в первую очередь.
я тоже думал в эту сторону, но это отсеялось. Вернее, я сначала сделал все через passthru, и довольно быстро, но в ответ пришло что нельзя использовать подобное (exec, system в этом контексте считаются подобными).

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

Да и человек явно или сам знающий, или отдавал код кому-то на проверку.
UFO landed and left these words here
UFO landed and left these words here
Пояснения есть в книгах и статьх — гораздо более развёрнуто и доступно, чем в формате комментария.

UFO landed and left these words here
UFO landed and left these words here
ну остается только возрадоваться, что по ходу был доступ по FTP, да и на интернет или другое средство связи с исполнителем у заказчика были средства.
Ну а так: работает и хорошо, задача выполнена, хотя да, проверок я бы добавил.
Вот я понимаю, что в 2011 году это уже звучало как анекдот, но даже сейчас, 5 лет спустя некоторые халявные хостинги не предоставляют клиентам FTP доступ, позволяя работать строго через встроенную систему. Я столкнулся давеча и был невероятно удивлён этим фактом.
Автора видимо ни чуть не смущает, что если в одну из итераций запуска «демона» он умрет, то перезапустить его будет некому. Хранение данных в сессии тоже не есть хорошо. Сессии они такие, имеют свойство умирать, особенно когда все находится в одном месте, в /tmp, и админ любит «оптимизировать» нагрузку на фс принудительными зачистками этой директории. И на хостинге где нет даже крона шанс встретить такого «специалиста» очень высок.
Критику я всю выслушал, определенную часть знаний почерпнул, определенная у меня уже была (во-первых, скрипт писался год назад, во вторых, делался он в соответствии с определенными требованиями и ограничениями, ну и основной функционал вообще убран, в том числе, кнопка остановки работы скрипта).

Собственно, в статье целью было не скрипт/программу/продукт/модуль или еще что-то предоставить, а идею. Это не какой-то готовый класс для работы, а пример реализации логики.
Да, задача поставлена необычно, реализовывать пришлось с извращениями + мои ошибки, но может быть кому-то еще пригодится это.

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

Берёте любой html/ajax эмулятор терминала (тот же ajaxterm), запускаете с /bin/bash (/bin/sh и т.д.), подключаетесь, дальше: nohup application &. Если повезло и есть screen, то ещё проще.
Спорный вопрос, потому как и аякс и терминал отбросил заказчик.
Однако может аякс он отбросил в том что я хотел сделать, а терминал таким образом можт и можно было запустить, честно, не думал.
Only those users with full accounts are able to leave comments. Log in, please.