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

WP

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

И вообще, честно, не вижу НИ ОДНОГО плюса работы с fork().
> Инженер может и 5 секунд подождать выдачи.
Во-во, да он может и в консоле это всё ручками набрать... да и юзер тоже, зачем вообще писать что-то. Мы ведь рассматриваем как лучше, а не как можно. А чтоб он не ждал а постепенно получал результаты - удобнее.
 

MiksIr

miksir@home:~$
Табличку с чем? С тем, работает или нет тот или иной узел - это логическая информация. Впрочем, если нужен текст, то да, такое решение не подходит - нужно другие. Их можно сделать и с форком (используя пайпы), но это уже сложнее, правда.

> Если мы заговорили о красоте и производительности, то вспомним что при fork() создается копия процесса.
Да да... вот я и говорю, что в моем случае происходит минимум 1 форк, а в Вашем - два форка - один в PHP, другой в шеле.

> Во-во, да он может и в консоле это всё ручками набрать... да и юзер тоже, зачем вообще писать что-то.
О каких юзерах Вы говорите? Давайте исходить от исходной задачи, а не утрировать и придумывать "как могло бы быть".

> И вообще, честно, не вижу НИ ОДНОГО плюса работы с fork().
Это сложно объяснить словами, правда. Все равно, что пытаться объяснять плюсы ООП-а тем, кто пишет hello "word" и мешает пхп с html-ем.

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

антигерой

Новичок
1) Отключить таймлимит этому скрипту, если это вообще можно сделать В ПРИНЦИПЕ(не знаю).

2) считать секунды и за 5 секунд допустим до конца таймлимита скрипта - вызывать его заново(зациклить) с текущей позиции обработки(это у меня спамилка так сама себя зацикливает):

$timer=mktime();
..............
..............
..............
if((mktime()-$timer)>24) { $nextfile="http://".getenv("SERVER_NAME").getenv("SCRIPT_NAME")."?startline=".$incounter; @file_get_contents("$nextfile"); exit(); }

Результат работы такового скрипта сливать в отдельный html файл для просмотра дальнейшего.

3) Создать ПСЕВДО-Многопоточность(ибо самой по себе многопоточности у процесора не бывает, он просто запускает несколько процессов и выполняет их по очереди). Сделать это можно кажись так:
$counter=0;
while($counter<20)
{
$fl=fopen("http://bla-bla-bla.xyz/?startline=".($counter*xxx),"r"); fclose($fl);
$counter+=1;
}
Но для 100% надёжности всёравно требуется зациклить каждый из потоков до полной обработки своего сегмента. Поэтому многопоточность здесь совершенно нет смысла делать. Гемора на порядок больше - плюсы сомнительны.

Лучший вариант из этих трёх - второй.
 

fill_nick

Новичок
WP предложил наилутший для меня вариант. Пшп скомпилирован без поддержки Форка, поэтому я его исключаю, начальник не дал добро на перекомпиляцию ППШ.
Я скрипт почти полностью переделал, вот что будет приблизительно в результате:

touch($rici = '/srv/www/virtual/admin/html/vuzol2/temp/'.$a.'_rici');
shell_exec ('/usr/lib/nagios/plugins/check_ping -H 192.168.х.х -w 100.0,10% -c 300.0,50% -t 5 >
'.$rici.' &');

$file = fopen("$rici","r");
if(!file)
{
echo("Файл открыть невозможно");
}
$del=$rici;
$zero="";
$dani=fgets($file,600);
$R=strcmp($zero, $dani);
if ($R==0)
{
$i=0;
while ($i==0)
{
fclose ($file);
$file = fopen("$rici","r");
$dani=fgets($file,600);
$R=strcmp($zero, $dani);
if ($R!=0)
{
$i=1;
}
}
}
$rici=$dani;
unlink($del);

После этого данные с переменной $rici будут содержать в себе результат проверки.

WP провел проверку одного из узлов с помощью Вашего алгоритма.
По старой версии (последовательная проверка узлов) - 46-50 секунд.
По Вашему алгоритму - 11-15 секунд - что уже есть приемлемо.
Большое спасибо!

-~{}~ 09.07.07 09:59:

Здесь цикл:

while ($i==0)
{
fclose ($file);
$file = fopen("$rici","r");
$dani=fgets($file,600);
$R=strcmp($zero, $dani);
if ($R!=0)
{
$i=1;
}
}
по сути проверяет появились ли данные в файле. Тут в окончательном варианте, наверное поставлю
sleep (1) что-бы проверка появления данных в файле проводилася не чаще чем раз в секунду. Так же по совету WP наверно буду пользоватся grep.
 

WP

^_^
А можно и не через ps узнавать, а через '&& touch done.txt', разницы особой нет.
 

WP

^_^
Нечто вроде (command > file.txt && touch done.txt) &
Т.е. после завершения command > file.txt будет выполнено touch done.txt, и можно установить завершен ли процесс по существованию этого файла.
Если не сработает синтаксически, через file.sh можно решить.
 
Сверху