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

  • Автор темы Автор темы McLay
  • Дата начала Дата начала

McLay

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

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

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

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

Подскажите, пожалуйста.
 
php5: [m]curl[/m] (multi_handle)
[m]socket_select[/m]

или написать на любом другом ЯП, поддерживающем потоки (threads)
 
Если использовать socket_select. Как определить какой именно сокет можно читать?

-~{}~ 30.03.05 18:17:

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

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

в массив $read будут записаны только те сокеты, которые доступны для чтения
 
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, если не пустой, значит сокеты в нем нужно закрыть с пометкой "по таймауту"
 
Сверху