Фоновый процесс - PHP
На PHP я стал писать относительно недавно и многого могу не знать.
Проблема в том, что мне необходимо устроить фоновый процесс, который будет анализировать особым образом нечто в файловой системе сервера и пересылать мне данные анализа на почту. Сам процесс, довольно ресурсоемкий и мне кажется, что забивать его в цикл нецелесообразно.
Подскажите пожалуйста, какой либо способ постоянной фоновой проверки.
Каждая проверка будет заносить результаты в MySQL. Так вот как сделать, чтобы фоновый процесс работы с CУБД работал постоянно и без остановки... Т.е. просмотр времени в записи БД и сверка с текущим временем. Если время настало, то делаем что-то... И так постоянно..
Каждая проверка начинается максимум в интервале 5-10 минут. Но думаю, что будет стоять 3 минуты. Я конечно уповаю на то, что MySQL считается постфактум самой быстрой СУБД...но все таки...
Средства: Apache2+PHP5+MySQL5.
Apache тут ВООБЩЕ никаким боком. по крайней мере - я тут не увидел для чего он. пока - отметаем его с негодованием.
мне кажется, что забивать его в цикл нецелесообразно.
Подскажите пожалуйста, какой либо способ постоянной фоновой проверки.
- запуск из планировщика (cron если UNIX\Linux)
- используя демон. как реализовывается демон на PHP - не знаю, не пишу на PHP, но думаю примеры несложно найти в инете.
MySQL считается постфактум самой быстрой СУБД...
это заблуждение, весьма распространенное среди тех, кто кроме MySQL не видел СУБД :)
Сам процесс, довольно ресурсоемкий
желательно - раскрыть задачу подробнее. я часто сталкиваюсь с тем, что начинающие имеют превратное представление о "ресурсоемкости" своей задачи. если же задача действительно ресурсоемкая - возможно придется вообще отказаться от PHP
- используя демон. как реализовывается демон на PHP - не знаю, не пишу на PHP, но думаю примеры несложно найти в инете.
А демон делается как автора не устраивает: бесконечный цикл while(true) {}.
я стал писать относительно недавно и многого могу не знать.
то, думаю, автора мы разубедим :)
Не имею представления, как организовать подобный цикл. Мысль конечно глупая и смешная, но не писать же в bugaga.php сей цикл, запустить его и оставить окно бразера открытым =)
Насколько помню, демон, это служба присущая только unix-based системам. У меня же серв поднят дома под виндой.
По поводу СУБД, возможно вы и правы. Я, лишь, вычитал это в книге. До этого всецело имел дело с IBExpert, Access и Paradox.
Я человек не ленивый. Поэтому буду рад, если вы хотя бы сообщите где копать. Просто такой ситуации я еще не встречал в статьях и книгах. Поэтому и решил спросить тех, кто на практике решал подобные задачи.
Юзер записывает файл на сервер. Вместе с тем, в связанную таблицу MySQL добавляется инфа о том, что такой то юзер, залил такой то файл с такой то датой и временем. Затем, по истечению данного срока, этот файл пересылается мне на мыло (оригинал удаляется).
Так вот я не могу понять в каком цикле (или коль уж так развиваются страсти службе) реализовать => проход по БД+сверка времени+отправка файла. И первое и второе и третье в отдельности я могу реализовать. А вот, чтобы сие действие шло непрерывно, увы, пока никак. ОЧЕНЬ важно чтобы цикл бесперебойно проводил итерации. Такой форс-мажор, как висяк сервера в расчет не берется. Кстати о сервере, сильно ли будет его грузить подобный цикл? Да и...вы уж простите за любопытство, но интересно. Не имею пока достаточного опыта в WEB программировании. Что будет если не успеет завершиться одна итерация, как уже должно наступить время следующей. Чисто теоретически?
Так я уже написал :D
Мысль конечно глупая и смешная, но не писать же в bugaga.php сей цикл, запустить его и оставить окно бразера открытым =)
Есть cront про него уже писали. На винде это планировкщик.
Вот демон на примере сокета: http://alekciy.ru/test/anchor.php?url=http%3A%2F%2Fwww.php.net%2Fmanual%2Fru%2Fref.sockets.php&text=Simple%20TCP%2FIP%20server#anchor
Насколько помню, демон, это служба присущая только unix-based системам. У меня же серв поднят дома под виндой.
Это не более, чем термин. На винда их просто называют фоновыми задачами, службами. Но сути это не меняет.
:D :D :D :D
Неужели ты думаешь,что идут хаотически/одновременно?
Я могу с точностью ответить на "что если бы" только на win языках - Delphi, C, Вася... В конце концов, вы тоже не с рождения знали премудрости кодинга)
Я могу с точностью ответить на "что если бы" только на win языках - Delphi, C, Вася... В конце концов, вы тоже не с рождения знали премудрости кодинга)
Да и не совсем понял по ссылке о сокетах. В Делфьине или C это можно назвать уровнем абстракции связи клиента и сервера...И планировщик все же нежалателен, т.к. лучше сразу ориентироваца на unix, т.к. будет на нем в итоге стоять.
Вообще, в голову пришла тупая мысль настрогать в Delphi exe-шник проивзодящий данный запрос регулярно. Но, это кажеться глупостью.
Почитав http://webscript.ru/stories/06/08/29/3262393 это, поищу демон написанный на PHP для перебора паролей. Думаю, там есть некая схожесть. А вообще, огромная просьба. Разьясните более подробно что использовать.
Я могу с точностью ответить на "что если бы" только на win языках - Delphi, C
Ну назвать C - win языком просто неслыханная наглость =)))
Скорее компилируемые языки. )
По сути вопроса - ели есть представление как напимать такой фоновый бесконечный процесс на C - пиши точно ток же и на php. php - это такая же программа, только интерпретируемая, а не компилируемая, и она точно так же может быть отдельно запущенна на сервере безо всякого вебсервера и браузера. Правда не знаю почему писать надо именно на php, а не на том же C, но если есть причины - так вперед.
Правда писать демона имеет смысл, если требюуется его постоянная работа, когда перерывы между sleep-ами небольшие. Если же он что то полезное будет выполнять раз в несколько минут, а процесс стартует быстро, то прощще наверно всеж по планировщику задач запускать (cron например)?
Сокеты - это для работы с сетью. Если твой процесс не должен ни с кем общаться по сети - зачем ему сокеты???
Ну да...Тут я немного переборщил)))
"По сути вопроса - ели есть представление как напимать такой фоновый бесконечный процесс на C - пиши точно ток же и на php. php - это такая же программа, только интерпретируемая, а не компилируемая, и она точно так же может быть отдельно запущенна на сервере безо всякого вебсервера и браузера. Правда не знаю почему писать надо именно на php, а не на том же C, но если есть причины - так вперед."
На С ябы это бы простовпихнул в управляемый бесконечный цикл, и добавил бы для удобства иконку в трею. Или бы написал сервис. Но как сделать подобное в PHP не знаю.
Насчет сокетов) Я спрашивал не вообще о сокетах, а конкретно на PHP как могу их использовать. IMHO, "localhost:80" и "Client<>Server" тоже сокеты...Но разные :) Хотя ясно, что автор поста имел ввиду второе значение сокета. А вот в каком варианте я не понял. Планировщик хорош, но не так желаем. Но, тут подсказали способ, что можно как то с использованием sockets это сделать. Вот и спросил)))
"она точно так же может быть отдельно запущенна на сервере безо всякого вебсервера и браузера"
Вот тут пожалуйста, поподрбней. Это как без сервера, это как без браузера? Быть может, я в шаге от реализации)
Я могу с точностью ответить на "что если бы" только на win языках - Delphi, C, Вася... В конце концов, вы тоже не с рождения знали премудрости кодинга)
Ха, если знаешь один язык, разобраться в другом не проблема. А вопрос об итерациях в цикле и вовсе убил :D . Неужели в "Delphi, C, Вася..." итерации у тебя идут не последовательно? ))
Да и не совсем понял по ссылке о сокетах.
Да это я просто привел как пример бесконечного зацикливания ибо там как раз делают демон. И сокет в данном контексте совершенно тут не причем, просто привел первый попавшийся пример с PHP демоном и бесконечным циклом.
Вот тут пожалуйста, поподрбней. Это как без сервера, это как без браузера? Быть может, я в шаге от реализации)
PHP может прекрасно работать без Апача как CLI. Знаю народ, который пишет на нем административные скрипты в AD виндошном взамен стандартных скриптов. Говорят намного удобнее и гибче.
Там конечно идут последовательно) Порой даже более чем) Только моя проблема не в языке, а в его действии на машине. Поясню.
Дано:
Скрипт 1 - action.php, Скрипт 2 - loop.php.
Action, как ты понял, производит действие.
loop.php вызывает скрипт action в некотором интервале c проверкой на то, закончил ли он выполнение или нет. Если да -> сверяем время и производим итерацию.
Я не знаю, как в PHP узнать о том, закончилось ли выполнение скрипта action, чтобы приступить к следующей итерации вызванной loop.php.
Пока я вижу только такую конструкцию. И то - туманно в ввиду постоянной работы цикла.
P.S. И вовсе нет смысла смеятся над чужим незнанием. Ты тоже многого не знаешь и тебе тоже будет неприятно если над тобой будут смеятся. Давайте будем солидарны друг к другу. :)
Просто я неуверенно чувствую себя в новой для меня среде. Это нормально и со временем пройдет)
http://rumata.dragons.ru/article.php?story=20061120170945727&mode=print
Это многое для меня прояснило. Блин. Мосчный оказывается язык. Жаль многопоточности нет :)))
На С ябы это бы простовпихнул в управляемый бесконечный цикл,
Просто цикл слишком жестко - надо хотя бы делать sleep потоку. Ато выжрец все ресурсы проца )
и добавил бы для удобства иконку в трею. Или бы написал сервис.
Никаких иконок, сервисов не надо - просто исспользуя стандартные средства С и С++ это прекрасно пишется.
Но как сделать подобное в PHP не знаю.
Да точно так же. Написать тот же цикл, теже sleep-ы. Вроде основные операторы, цыклы, условные операторы особо не отличаются - в чем проблема? ))
IMHO, "localhost:80" и "Client<>Server" тоже сокеты...Но разные :)
ну это бред. Всеже почиитай как нибудь про сетевые технологии и механизм сокетов. Но в товоем случае сокеты совершенно не при чем.
Вот тут пожалуйста, поподрбней. Это как без сервера, это как без браузера? Быть может, я в шаге от реализации)
Ну как как - это такая же программа как на C том же. Она так же может быть просто запущенна на сервере. Как обычная любая другая программа. Только она интерпретируемая и ее надо через интерпретатор запускать (но тебели при basic-е не знать что это такое).
Так прям и запускаешь: php YourScript.php
И веб-сервер с браузером тут совсем не при чем. Там php для других задач служит - генерации контента страниц. Но точно так же и другой язык исспользовать (да хоть тот же С =)) ) у php просто это основное применение. Но в твоей же задаче это не требуется )
Блин. Мосчный оказывается язык.
Ну это ты конечно загнул. )))
Мощный =))
<?
пока не набрали "stop" выполняем что-то постоянно?
?>
Ну...кхе-кхе...Наскок я понял в корне php есть экзешник php-cli или php-cgi (в моем случае). Так вот в нем >php script.php)))
Просто если вы все говорите о похожести PHP на другие языки то почему бы не сделать подобие терминала..
А вы не знаете каждый ли платный хостинг предоставляет его? (сайт не под NT будет. Эт точно). И может ли он давать сбой?
P.S. Еще раз восхищаюсь гибкостью языка) Рулеz)
А вы не знаете каждый ли платный хостинг предоставляет его? (сайт не под NT будет. Эт точно).
Ну так смотри в условиях хостинга. Нормальные хост компании такое предоставляют.
<?
пока не набрали "stop" выполняем что-то постоянно?
?>
по умолчанию, и как правило Ctrl+C в консоле будет тебе STOP для скрипта на все 100% :-D
а вообще, сделай скрипт, который будет рулить запуском и остановкой выполнения твоего "демона"...
например там... типа того: есть файл start.lock запускать но ничего не делая завершать, а нету его - стартуемся по крону спокойно )
вот этого -
не надо.
кроме того, я так и не понял - зачем нужен Апач :)
А вы не знаете каждый ли платный хостинг предоставляет его? (сайт не под NT будет. Эт точно). И может ли он давать сбой?
P.S. Еще раз восхищаюсь гибкостью языка) Рулеz)
почитайте еще єто пригодится
http://www.ibm.com/developerworks/ru/library/os-php-batch/
http://www.ibm.com/developerworks/ru/library/os-php-batch/
Спасибо...Занятно... :rolleyes:
У меня есть такая вещь:
script.cmd:
setlocal
set open_basedir = c:\phpscripts
endlocal
start "" /min "c:\program files\php\php-cgi.exe" c:\phpscripts\script.php
Последняя строчка так длинно не помню зачем сделана, это я вроде пытался закрыть cmd-окошко, которое вызвало php, а то их два открыто было, разражали.