Несколько HTTP соединений одновременно в PHP

McLay

PHP5 BetaTeam
Несколько HTTP соединений одновременно в PHP

Есть задача - забрать контент через http с разных адрессов, и сделать это как можно быстрее.

Очевидно, нужно открывать несколько соединени. Но как это сделать оптимальнее?

открыть несколько сокетов, а потом в цикле читать поочереди из каждого определенными порциями? Или как-то еще?

Подскажите, пожалуйста.
 

Макс

Старожил PHPClub
php5: [m]curl[/m] (multi_handle)
[m]socket_select[/m]

или написать на любом другом ЯП, поддерживающем потоки (threads)
 

McLay

PHP5 BetaTeam
Если использовать socket_select. Как определить какой именно сокет можно читать?

-~{}~ 30.03.05 18:17:

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

Это принципиально, возможно средствами PHP4 (не 5)? (исключая pcntl)
 

Макс

Старожил PHPClub
Если использовать socket_select. Как определить какой именно сокет можно читать?
[m]socket_select[/m]
int socket_select ( array &read, array &write, array &except, int tv_sec [, int tv_usec] )

в массив $read будут записаны только те сокеты, которые доступны для чтения
 

McLay

PHP5 BetaTeam
2Макс, угу, спасибо.


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

PHP:
//создание сокетов, без socket_set_nonblock
$stime = time();
while( count($sockets)>0 && (time()-$stime)<$timeout)
{	
	$arr = $sockets;	
	if(socket_select($arr,$w=null,$e=null,1)>0)
	{
		foreach($arr as $socket)
		{
			if (($read = socket_read($socket, 16384, PHP_BINARY_READ)) === false || $read == '')
			{
				socket_close($socket);
				unset($sockets[$socket]);				
			}
			else
			{				
				$buf[$socket].= $read;
			}
		}
	}
}
//проверка $sockets, если не пустой, значит сокеты в нем нужно закрыть с пометкой "по таймауту"
 
Сверху