- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
<?php
// страницы, содержимое которых надо получить
$urls = array('www.yandex.ru', 'www.google.ru', 'www.mail.ru', 'www.rambler.ru');
$rtasks = array(); // задачи чтения
$wtasks = array(); // задачи записи
$results = array(); // результаты
foreach ($urls as $url) {
// открываем отдельный сокет
$sh = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$sh) continue;
// таймаут для чтения
socket_set_option($sh, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 10, "usec" => 0));
// таймаут для записи
socket_set_option($sh, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 10, "usec" => 0));
// задаем неблокирующий режим сокетов
socket_set_nonblock($sh);
// определяем ip хоста
$ip = gethostbyname($url);
// соединяемся
socket_connect($sh, $ip, 80);
// добавляем в задачи для записи
$wtasks[$url] = $sh;
}
// продолжаем, пока есть задачи для записи или чтения
while ($wtasks || $rtasks) {
// массив для сокетов с возможностью чтения
$rtasks_ = $rtasks;
// массив для сокетов с возможностью записи
$wtasks_ = $wtasks;
// ждем результатов из сокетов
$n = socket_select($rtasks_, $wtasks_, $e=null, 10);
if ($n > 0) {
// сокеты, доступные для записи
foreach ($wtasks_ as $sh) {
// ищем урл страницы по дескриптору сокета в массиве задач записи
$url = array_search($sh, $wtasks);
// удаляем из задач записи
unset($wtasks[$url]);
// добавляем в задачи чтения
$rtasks[$url] = $sh;
// формируем http-заголовки
$headers = "GET / HTTP/1.0\r\n";
$headers .= "Host: ".$url."\r\n";
$headers .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.6) Gecko/2009011913 MRA 5.3 (build 02557) Firefox/3.0.6\r\n";
$headers .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
$headers .= "Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n";
$headers .= "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n";
$headers .= "\r\n";
// записываем в сокет
if (socket_write($sh, $headers) === false) fclose($sh);
}
// сокеты, доступные для чтения
foreach ($rtasks_ as $sh) {
// ищем урл страницы по дескриптору сокета в массиве задач чтения
$url = array_search($sh, $rtasks);
if (!$url) continue;
// считываем результат из сокета
$result = '';
while ($r = socket_read($sh, 1024)) $result .= $r;
// закрываем сокет
socket_close($sh);
// удаляем из задач чтения
unset($rtasks[$url]);
// заносим html в массив результатов
$results[$url] = $result;
}
}
else {
break;
}
}
?>
dev6alexander 15.12.2011 15:32 # 0
guest 16.12.2011 18:42 # 0
guest8 09.04.2019 12:23 # −999