Решал написать функцию для получения страничек/файлов в несколько потоков. Получается: | Код | <?php
error_reporting(E_ALL); ini_set('display_errors', '1');
function getFiles($url, $timeout = 30) { foreach ($url as $id => $purl) { $purl = parse_url($purl); $purl['port'] = (isset($purl['port'])) ? $purl['port'] : '80'; if (isset($purl['host']) && $stream = stream_socket_client($purl['host'] . ':' . $purl['port'], $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT)) { $streams[$id] = $stream; $info[$id] = $purl; } } while (sizeof($streams)) { $read = $write = $streams; if (stream_select($read, $write, $except = NULL, $timeout) > 0) { foreach ($write as $sid => $stream) { $id = array_search($stream, $streams); echo $stream . ' for write ready' . PHP_EOL; if (isset($info[$id]['path'])) { $headers = "GET " . $info[$id]['path'] . " HTTP/1.0\r\n"; } else { $headers = "GET / HTTP/1.0\r\n"; } $headers .= "Accept: */*\r\n"; $headers .= "Accept-Language: ru\r\n"; $headers .= "Host: " . $info[$id]['host'] . "\r\n"; $headers .= "User-Agent: SH-Bot\r\n"; $headers .= "Connection: Close\r\n\r\n"; fputs($stream, $headers); } foreach ($read as $sid => $stream) { echo $stream . ' for read ready' . PHP_EOL; $id = array_search($stream, $streams); $result[$id] = ''; while (!feof($stream)) { $result[$id] .= fgets($stream); } fclose($stream); unset($streams[$id]); } } else { break; } } return (isset($result)) ? $result : FALSE; }
if ($result = getFiles(array('http://ya.ru', 'http://mediazona.ru'))) { //print_r($result); }
?> |
Результат работы: | Код | Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #2 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #2 for read ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for write ready Resource id #3 for read ready |
Но есть один косяк - цикл foreach $write проходится по несколько десятков раз, пока не считаются данные. То есть происходит повторная запись заголовков в поток, который еще не считался. Как предотвратить? Пытался в конце цикла foreach $write делать unset($write[$id]) но не помагает. В общем по разному извращался, пока что сделал так: | Код | <?php
error_reporting(E_ALL); ini_set('display_errors', '1');
function getFiles($url, $timeout = 30) { foreach ($url as $id => $purl) { $purl = parse_url($purl); $purl['port'] = (isset($purl['port'])) ? $purl['port'] : '80'; if (isset($purl['host']) && $stream = stream_socket_client($purl['host'] . ':' . $purl['port'], $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT)) { $streams[$id] = $stream; $info[$id] = $purl; } } $saved = array(); while (sizeof($streams)) { $read = $write = $streams; if (stream_select($read, $write, $except = NULL, $timeout) > 0) { foreach ($write as $sid => $stream) { $id = array_search($stream, $streams); if (in_array($id, $saved)) { continue; } echo $stream . ' for write ready' . PHP_EOL; if (isset($info[$id]['path'])) { $headers = "GET " . $info[$id]['path'] . " HTTP/1.0\r\n"; } else { $headers = "GET / HTTP/1.0\r\n"; } $headers .= "Accept: */*\r\n"; $headers .= "Accept-Language: ru\r\n"; $headers .= "Host: " . $info[$id]['host'] . "\r\n"; $headers .= "User-Agent: SH-Bot\r\n"; $headers .= "Connection: Close\r\n\r\n"; fputs($stream, $headers); $saved[] = $id; } foreach ($read as $sid => $stream) { echo $stream . ' for read ready' . PHP_EOL; $id = array_search($stream, $streams); $result[$id] = ''; while (!feof($stream)) { $result[$id] .= fgets($stream); } fclose($stream); unset($streams[$id]); } } else { break; } } return (isset($result)) ? $result : FALSE; }
if ($result = getFiles(array('http://ya.ru', 'http://mediazona.ru'))) { //print_r($result); }
?> |
Результат работы: | Код | Resource id #3 for write ready Resource id #2 for write ready Resource id #2 for read ready Resource id #3 for read ready |
То есть если произошла запись заголовков в поток, то в массив saved добавляется id потока и потом при повторном проходе массива $write данный поток игнорирутеся. Но имхо это далеко не рациональное решение. Должен быть какой-то вариант типа unset($write[$id]), но как его организовать. ЗЫ: Что делает функция stream_select? Я так понял, возвращает количество потоков доступных для записи или чтения? Но как имеено идет расчет? Ведь на входе - два массива $write и $read. Это сообщение отредактировал(а) CyClon - 6.10.2007, 15:25
|