|
|
|
|
|
для: 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
?>
|
Так? | |
|
|
|
|
|
|
|
для: Shorr Kan
(20.04.2007 в 10:11)
| | у меня тоже все в цикле и открываются разные страницы, просто я не указал здесь главный модуль который обращается к функциям... поймите одно снчала открываем все какие нужные сокеты, потом получаем и обрабатываем результаты... | |
|
|
|
|
|
|
|
для: KPETuH
(20.04.2007 в 05:42)
| | Так а если три, пять, десять разных ресурсов - каким образом можно ОДИН раз открыть сокет?
да вроде бы и в тамошнем ( http://www.stableversion.com/2006/04/17/multithread-php/ ) примере - fsockopen внутри цикла. | |
|
|
|
|
|
|
|
для: 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 которая делает паузу в микросекундах, при хорошем канале этого достаточно. (величину микросекунд подбирал опытным путем)... | |
|
|
|
|
|
|
|
<?
$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 содержит три элемента. Пока что. | |
|
|
|
|