[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP демон и mysql
Страницы: 1, 2
vetatto
Цитата (killer8080 @ 5.04.2013 - 22:02)
Цитата (sergeiss @ 5.04.2013 - 19:26)
Я вот тоже не понял: зачем плодить какие-то дочерние процессы?

например чтоб ускорить процесс, распараллеливание задач имеет смысл.
Но архитектуру нужно пересматривать, многопроцессовые демоны нужно строить по принципу мастер-слейв. Главный процесс должен распределять задания по слейвам, и следить за их состоянием, при необходимости перезапускать форки (на случай утечки памяти например)

Вот как раз и хочется так сделать. Так как дел мало имел с демонами решил у знающих людей спросить. Просто кол-во запросов может достигать 1000 в час и хотелось чтоб большая часть из них успела обработаться. Если часа будет мало можно увеличить до двух. Но запросы могут идти подряд штук 100 может быть 1 потом пауза может вообще без паузы.

Вот и решено было делать демона и плодить процессы. Сделать то сделал. Плодить плодятся, а вот как им сказать какой запрос делать не понимаю.
killer8080
Цитата (vetatto @ 5.04.2013 - 21:09)
а вот как им сказать какой запрос делать не понимаю.

используй разделяемую память, там же вроде об этом написано было.
http://www.php.net/manual/ru/book.shmop.php



Спустя 1 минута, 7 секунд killer8080 написал(а):
про семафоры то же почитай
http://www.php.net/manual/ru/intro.sem.php
vetatto
Цитата (killer8080 @ 5.04.2013 - 23:13)
Цитата (vetatto @ 5.04.2013 - 21:09)
а вот как им сказать какой запрос делать не понимаю.

используй разделяемую память, там же вроде об этом написано было.
http://www.php.net/manual/ru/book.shmop.php



Спустя 1 минута, 7 секунд killer8080 написал(а):
про семафоры то же почитай
http://www.php.net/manual/ru/intro.sem.php

Вот сижу читаю) Просто ответил на Ваше сообщение.

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

Так можно реализовать? Это будет правильный подход?
sergeiss
Цитата (vetatto @ 5.04.2013 - 23:09)
Просто кол-во запросов может достигать 1000 в час и хотелось чтоб большая часть из них успела обработаться. Если часа будет мало можно увеличить до двух. Но запросы могут идти подряд штук 100 может быть 1 потом пауза может вообще без паузы.


Цитата (vetatto @ 5.04.2013 - 23:31)
Главным процессом создать очередь для каждого дочернего внести в него id записей БД, а дочерними получить очередб выполнять задание и удалять из очереди выполненные. А пользовательскими сигналами опрашивать состояние дочерних процессов.


Так я и не понял до сих пор. Надо просто обработать некие запросы, чтобы они обязательно в параллель обрабатывались или все-таки просто их обработать?

Вот смотри. Я делал нечто подобное, система работает как часы smile.gif Уже 4 месяца как уволился из той "конторы", но демон пашет до сих пор wink.gif И до этого работал около 2-х лет. Я опишу кратко, возможно, что тебе поможет.

Итак, задача была такая. Есть файлы на нескольких FTP-серверах. Они появляются раз в час, известно только примерное время создания, +/- 20 минут. Надо данные из них загрузить в БД.

Я сделал в итоге такую систему. По крону раз в 30 минут запускаются скрипты, проверяющие наличие новых файлов на FTP. Если есть новые, то они загружаются во временный каталог сервера. Одновременно инфа о них пишется в БД (имя, тип данных и индикатор необработанности). Данные из этой же таблицы используются при оценке наличия новый файлов.
Далее. Раз в 5 минут запускается, также по крону, новый экземпляр демона загрузки данных. Он сначала проверяет наличие работающего экземпляра предыдущего демона - проверка делается через запись определенной инфы в обычный текстовый файл (состояние и время запуска). Если предыдущий демон отработал исправно или работает более 15 минут, то начинает работать текущий, новый. Иначе новый просто отключается.
Демон загрузки берет из БД список файлов, которые еще не были загружены, и начинает их грузить в БД. Обработка каждого файла занимает от долей секунды до 5-10 секунд, в зависимости от объема и типа данных. Демон должен прекратить работу, когда по окончании обработки очередного файла он определяет, что от начала запуска прошло больше 4 минут 30 секунд (30 секунд до 5 минут - запас на всякий случай). Либо, естественно, если он выбрал все файлы, готовые к загрузке. Как только файл обработан, то он удаляется из временного каталога, а в БД ставим метку о том, что он обработан успешно. Если при обработке произошел сбой, то ставим метку о сбое при загрузке именно этого файла и продолжаем работу.

Получаем, что постановка файлов в очередь загрузки и сама загрузка идут в разных процессах. Иногда даже одновременно, в параллель и при этом не мешают друг другу.

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


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.