PHP и многопоточность

fill_nick

Новичок
PHP и многопоточность

Добрый день, уважаемые господа!

Ситуация следующая: написан скрипт на ПШП для одновременной проверки всех сетевых устройств на узле Интернет. Если возникают проблемы дежурный узла, через ВЕБ интерфейс, запускает даный скрипт и в виде таблицы получает результат. Результат каждой проверки заносится в переменные, например:

$k0=shell_exec ('/usr/lib/nagios/plugins/check_ping -H 192.168.53.189 -w 100.0,10% -c 300.0,50% -t 5');
$e1=shell_exec ('/usr/lib/nagios/plugins/check_ifoperstatus -d "E1 0/0" -H ******* -C ********');
$snmp=shell_exec ('snmpget -c ***** -v 2c 192.168.55.227 system.sysUpTime.0');

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

Прошу Вашей помощи!
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
длительное время которого нет
1. проверка через консоль. (Если меня не подводит память при выполнении через консоль тайм=лимит не установлен. Правда проверка так и останется последовательной.

Мой скрипт последовательно проверяет узлы, а нужно сделать эту проверку паралельно.
2. AJAX
 

fill_nick

Новичок
AJAX - это не то. Задача в том, что на узлах интернет есть несколько видов услуг, каналообразущая апаратура и т.д. Если через систему мониторинга приходит информация, что недоступный какой нибудь узел, то дежурный проверяет доступность всего оборудывание (есть много нюансов, зависимостей и т.д.).
Суть не в том, что бы дежурный видел, как загружается страница а получил ПОЛНУЮ информацию как можна быстрей, чтобы быстрей принять нужное решение.
Нужно чтобы пингование узлов, съем статистики по SNMP проходил паралельно - это сократит время общей проверки.
Сейчас проверка узлов проходит последовательно.

-~{}~ 04.07.07 15:30:

Luerssen!

Вы имели в виду pcntl_fork()?
Я что то не могу понять как это применить в моей ситуации.
Можна подробней?
 
fork создает точную копию процесса. в итоге ты получаешь уже два процесса. после вызова функции пишешь код, определяющий твое местоположение (процесс родитель/дочерний процесс) и выполняешь нужную обработку. в случае дочернего -- проверка узла и запись результатов в "нужное место" (например в shared memory), в случае родителя -- вывод результатов. за подробностями в ман.

p.s. если сильно взбредил, не ругайте.
 

WP

^_^
Mr_Max
Изменяет.
Орбит?
fill_nick
Не слушай их, дурные они, гвозди забивают микроскопом.

Сначала после перехода по ссылке на страницу с предполагаемой информацией делаешь
PHP:
$a = substr(md5(microtime()),0,8);
touch($p = './'.$a.'_1');
shell_exec ('/usr/lib/nagios/plugins/check_ping -H 192.168.53.189 -w 100.0,10% -c 300.0,50% -t 5 > '.$p.' &');
touch($p = './'.$a.'_2')
shell_exec ('/usr/lib/nagios/plugins/check_ifoperstatus -d "E1 0/0" -H ******* -C ******** > '.$p.' &');
touch($p = './'.$a.'_3')
shell_exec ('snmpget -c ***** -v 2c 192.168.55.227 system.sysUpTime.0 > '.$p.' &');
// etc..
Данный код отправит результат выполнения каждой из команд в соответствующий файл, при этом родительный процесс не будет ждать их завершения.
Затем отдаешь значение $a в некий Javascript, который через заданные промежутки времени стучится на сервер к другому скрипту который проверяет результаты и строит нужную таблицу на основе этих результатов.

-~{}~ 04.07.07 20:24:

Простейшая реализация если не дружишь с прелестями Javascript'а - header('Location: '.$_SERVER['PHP_SELF'].'?show='.$a);

И
PHP:
if (isset($_REQUEST['show']))
{
 // ...
}
 

AlexWhite

Новичок
Судя по путям у Вас используется Nagios, который сам решает эти задачи. Т.е. при возникновении проблем на узле запускается определенная задача.
Может легче разобраться с Nagios чем с ПХП ?
 

WP

^_^
AlexWhite
Теперь ты можешь с чистой совестью купить себе жвачку ;)
 

fill_nick

Новичок
WP
Интерестную идею Вы подали. Все оказалось намного проще чем я думал. Фактически через комбинацию:

$a = substr(md5(microtime()),0,8);
touch($p = './'.$a.'_1');

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

Спасибо всем!

П.С. WP - а чувство юмора у Вас жесткое :). Не хотелось бы попасть к Вам под раздачу.

-~{}~ 05.07.07 12:20:

AlexWhite

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

WP

^_^
fill_nick
Чтоб узнать завершились ли процессы - `ps ax | grep $a`

P.S. А Вы и не дали повода =) Можно чего-то не знать, в этом ничего постыдного нет, когда человек не знает и думает как что-то сделать, но хуже когда человек не знает и советует =)
 

romy4

invoke [brain]
WP
ps ax | grep $a - покажет и самого себя так что надо ещё добавлять
`ps ax | grep $a | grep grep`
 

WP

^_^
romy4
> ps ax | grep $a - покажет и самого себя
- Вы хотите об этом поговорить?

-~{}~ 06.07.07 19:52:

> `ps ax | grep $a | grep grep`
Тогда уж -i ;)
 

romy4

invoke [brain]
WP
точно, забыл :)
только не -i a -v
`ps ax | grep $a | grep -v grep`

-~{}~ 06.07.07 18:57:

> - Вы хотите об этом поговорить?
можно. процессы глобального развития вышеупомянутой утилиты
 

MiksIr

miksir@home:~$
WP дал гениальную идею... вместо схемы
PHP - FORK - SHELL он предложил схему PHP - SHELL - FORK. Называется, найдите отличия.
В первой схеме какие вижу плюсы - не нужно писать какихто жаваскриптов и дергать в цикле скрипты проверки результата - родитель сидит ждет своих детей и после выдает результат. Не нужно вообще никакой передачи через файлы, шаред мемори и тому подобное - для передачи состояния "работает/не работает" достаточно кода завершения, который передается родителю от ребенка. Минусы - придется написать небольшой менеджер детей с обработчиком SIGCHLD. Вообще задача, конечно, для пхп нетипичная... мож на перле сделаете? =)

-~{}~ 07.07.07 02:30:

ПСЫ - на перле есть прикольный CPAN модулек для многопоточности, могу поделиться похожим решением.
 

WP

^_^
А Вам не кажется что Ваше м....? (С)
> не нужно писать какихто жаваскриптов и дергать в цикле скрипты проверки результата - родитель сидит ждет своих детей и после выдает результат.
Вот из-за лени и получается хреновый софт. Человек вообще не должен ждать пока у него страничка загрузится больше одной, максимум двух секунд. Остальное должно происходить уже после загрузки страницы.
А теперь я тебе укажу на минусы.
1. pcntl стоит далеко не везде.
2. тебе придется писать больше
3. этот "сигнал" ты можешь получить через ps легко. и, мне интересно, как ты собрался передавать текст между процессами форканутыми.
 

MiksIr

miksir@home:~$
1. Мы же понимаем, что не о каком-то хостинге говорим.
2. Да, иногда, что бы написать правильно - надо написать больше. А если учесть ваши жаваскрипты да то пхп, что будет выводить результат - не больше получится, а даже меньше.
3. А в задаче нет указания, что нужно выводить текст. Более того, это в большинстве случаев мониторинга - не нужно - ответ можно свести к int-у.

> Вот из-за лени и получается хреновый софт.
Именно... именно из-за лени и делаются кривые решения "как бы побыстрее написать", вместо того, что бы не изобретать велосипед и не сделать правильно - используя именно для этого и придуманный форк. Хотя, я всегда считал, что форк для ПХП это большое извращение.

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

-~{}~ 07.07.07 03:05:

Кстати, уточнение - Ваше решение работает как PHP - FORK - SHELL - FORK ибо для того, что бы запустить шел пхп форкается (вернее делает clone, но это одного поля ягода). Не говоря уж об открытии пайпа PHP-шелл. В общем, очень "красивое" решение.

-~{}~ 07.07.07 03:23:

pps - хотя, конечно, WP прав - это _мое_ мнение, плюсы и минусы которого я описал.
 
Сверху