Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Пример работы с неблокирующими сокетами

Сообщения:  [1-5] 

 
 автор: Shorr Kan   (20.04.2007 в 19:08)   письмо автору
 
   для: KPETuH   (20.04.2007 в 11:28)
 

То есть -


<?

foreach($arr as $i=>$data){
$socket[$i]=fsockopen(........)
   }
//foreach


foreach($socket as $i=>$data){
     
                  
stream_set_blocking($fp,0);
                  
stream_set_timeout($fp,8);
                     
fwrite($socket[$i],$out);
                     
$s="";
                     while(!
feof($fp)){$s.=fgets($fp,1024);}//while
                     
$xml[$i]=$s
   }
//foreach


?>



Так?

   
 
 автор: KPETuH   (20.04.2007 в 11:28)   письмо автору
 
   для: Shorr Kan   (20.04.2007 в 10:11)
 

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

   
 
 автор: Shorr Kan   (20.04.2007 в 10:11)   письмо автору
 
   для: KPETuH   (20.04.2007 в 05:42)
 

Так а если три, пять, десять разных ресурсов - каким образом можно ОДИН раз открыть сокет?

да вроде бы и в тамошнем ( http://www.stableversion.com/2006/04/17/multithread-php/ ) примере - fsockopen внутри цикла.

   
 
 автор: KPETuH   (20.04.2007 в 05:42)   письмо автору
 
   для: Shorr Kan   (20.04.2007 в 02:53)
 

с трех елементов вы и не увидите разницу запихните туда элементов 50-100 тогда можно и поговорить :), эт первое, второе как я понянцип работы с неблокирующимим сокетами таков что сначала нужно открыть каналы, а патом уже принимать данные, обрабатывать полученные данные и тд...

например
здесь я открываю сокеты естественно функция вызывается в цикле...
function GetShip($log,$usid) //получаем инфо
{
    $ret = "";
    $fp = @fsockopen ("www.onlinegame.ru", 80, $errno, $errstr, 30);
    if ($fp) 
    {
     $head="GET /userinfo.php?sid=".$usid."&login=".$log."&page=ship HTTP/1.1\r\n";
     $head.="Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*\r\n";
     $head.="Accept-Language: ru\r\n";
     $head.="User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)\r\n";
     $head.="Host: onlinegame.ru\r\n";
     $head.="Connection: Keep-Alive\r\n";
     $head .="Cache-Control: no-cache\r\n";
     $head .="\r\n";
     stream_set_blocking($fp,false);
     stream_set_timeout($fp,3600);
     fputs ($fp,$head);
     return $fp;
    }
}

здесь идет получение и обработка результатов, в эту функцию подаются в цикле идентификаторы открытых сокетов...
function ShipPars($soc,$pause) //обработка инфо
{
    usleep($pause);
    $i=0;
     while (false !== ($str = fgets($soc))) 
     {
        $ret[$i++] = trim($str);
     }
     fclose ($soc);
     for ($i=0; $i<=sizeof($ret); $i++)
{
    if (strpos($ret[$i],"lab_useroffline.png")>1)
    {
        $status['status']="OffLine";
        continue;
    }
    if (strpos($ret[$i],"lab_useronline.png")>1)
    {
        $status['status']="OnLine";
        continue;
    }
//блаблабла здесь еще куча параметров парсится
}
     return $status;
}


при разработке использовал пример http://www.stableversion.com/2006/04/17/multithread-php/ скорость работы скрипта возросла в 6-10 раз... вместо sleep которая делает паузу в секундах я использовал usleep которая делает паузу в микросекундах, при хорошем канале этого достаточно. (величину микросекунд подбирал опытным путем)...

   
 
 автор: Shorr Kan   (20.04.2007 в 02:53)   письмо автору
 
 


<?
$start
=time();

foreach(
$url as $i=>$link){

            
$data=parse_url($link);
            
             
$out="GET ".$data['path']."?".$data['query']." HTTP/1.1\r\n";
             
$out.="Host: ".$data['host']."\r\n";
             
$out.="Connection: Close\r\n\r\n";
            
           
// print $out."<hr>";
            
$fp=fsockopen($data['host'],80,$errno,$errstr,7);
            if(
$fp){
                  
stream_set_blocking($fp,0);
                  
stream_set_timeout($fp,8);
                     
fwrite($fp,$out);
                     
$s="";
                     while(!
feof($fp)){$s.=fgets($fp,1024);}//while
                     
$xml[$i]=$s;
                     
fclose($fp);
                    }
//if
                 
else{
                 print 
$errno."<br>".$errstr."<hr>";
                 }
//else
            
}//foreach


print time()-$start;
?> 



Ставлю я строчки

stream_set_blocking($fp,0);
stream_set_timeout($fp,8);

или убираю их - результат всегда один: всё выполняется за 2-3 секунды. Я в чем-то ошибся?
Массив $url содержит три элемента. Пока что.

   

Сообщения:  [1-5] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования