Анимация
JavaScript
|
Главная Библионтека Сетевые функции Здесь я коротко рассмотрю некоторые сетевые функции, предоставляемые PHP. За более детальной информацией обращайтесь к сопроводительной документации. Работа с сокетами Помните, до этого мы обсуждали функцию fopen() и замечали, что ее можно использовать и для открытия сетевых соединений с файлами на других хостах в Сети. Однако функция fopen() позволяла работать лишь с содержимым файла, переданного по протоколу HTTP. Но ведь по HTTP, кроме "тела" документа, передаются также некоторые заголовки, посланные сервером. "Добраться" до них всех и позволяет функция fsockopen(). int fsockopen(string $host, int $port [,int &$errno] [,string &$errstr]) Эта функция работает аналогично fopen(), но только устанавливает сетевое соединение с указаннхм хостом $host и программой, закрепленной на нем за портом $port. Она возвращает файловый дескриптор, с которым затем могут быть выполнены обычные операции: fread() , fwrite() , fgets() , feof() и т. д. В случае ошибки, как обычно, возвращается false и, если заданы параметры-переменные $errno и $errstr, в них записываются соответственно номер ошибки (не равный нулю) и текст сообщения об ошибке. Если функция вернула false, но $errno тем не менее сбросилась в 0, это скорее всего означает, что произошла ошибка инициализации сокета. Например, такое может произойти, если в Windows не установлен требуемый протокол TCP/IP. Функция fsockopen() поддерживает и так называемые сокеты домена Unix, которые представляют собой в этой системе специальные файлы, наподобие каналов. Для использования такого режима нужно установить $port в 0 и передать в $host имя файла сокета. Мы не будем останавливаться на этом режиме, т. к. он специфичен для ОС Unix. По умолчанию сокет (соединение) открывается в режиме чтения и записи, используя блокирующий режим передачи. Вы можете переключить режим в неблокирующий, если вызовете функцию socket set blocking() (см. ниже). В примере из листинга 27.1 мы "проэмулировали" браузер, послав в порт 80 удаленного хоста HTTP-запрос get и получив весь ответ вместе с заголовками. Мы используем функцию HtmlSpecialChars(), чтобы вывести HTML-код документа в текстовом формате. 1 Листинг 27.1. "Эмуляция" браузера <? Соединяемся с Web-сервером www.php.net $fp = fsockopen("localhost", 80); Пос1лаем запрос главной страница: сервера fputs($fp,"GET / HTTP/1.0\n\n"); Теперь читаем по одной строке и в1водим ответ echo "<pre>"; while(!feof($fp)) echo HtmlSpecialChars(fgets($fp,1000)); echo "</pre>"; Отключаемся от сервера fclose($fp); ?> Разумеется, никто не обязывает нас использовать именно 80-й порт. Даже наоборот: функция fsockopen() универсальна. Мы можем использовать ее и для подключения к telnet-порту, и к FTP - словом, для чего угодно. int socket set blocking(int $sd, int $mode) Эта функция устанавливает блокирующий или неблокирующий режим для соединения, открытого ранее при помощи fsockopen() . В режиме блокировки ($mode=true) функции чтения будут "засыпать", пока передача данных не завершится. Таким образом, если данных много, или же произошел какой-то "затор" в сети, ваша программа остановится и будет дожидаться выхода из функции чтения. В режиме запрета блокировки ($mode=false) функции наподобие fgets() будут сразу же возвращать управление в программу, даже если через соединение не было передано еще ни одного байта данных. Таким образом, считывается ровно столько информации, сколько доступно на данный момент. Определить, что данные кончились, можно с помощью функции feof() , как это было сделано в примере из листинга 27.1. Функции для работы с DNS Здесь мы рассмотрим несколько очень полезных функций для работы с DNS-серверами и IP-адресом. Функция не гарантирует, что полученное имя будет на самом деле соответствовать действительности. Она лишь опрашивает хост по адресу $ip address и просит его сообщить свое имя. Владелец хоста, таким образом, может передать все, что ему заблагорассудится. Как обойти эту проблему, см. чуть ниже. string gethostbyname(string $hostname) Функция получает в параметрах доменное имя хоста и возвращает его IP-адрес. Если адрес определить не удалось, возвращает $hostname. array gethostbynamel(string $hostname) Эта функция очень похожа на предхдущую, но возвращает не один, а все IP-адреса хоста с именем $hostname. Как мы знаем, одному доменному имени может соответствовать сразу несколько IP-адресов, и в случае сильной загруженности серверов DNS-сервер сам выбирает, по какому IP-адресу перенаправить запрос. Он выбирает тот адрес, который использовался наиболее редко. Обратите внимание на то, что в Интернете существует множество виртуальных хостов, которые имеют различные доменные имена, но один и тот же IP-адрес. Таким образом, если следующая последовательность команд для существующего хоста с IP-адресом $ip всегда печатает этот же адрес: $host=gethostbyaddr($ip); echo gethostbyname($host); то аналогичная последовательность для домена с DNS-именем $host, наоборот, может напечатать не то же имя, а другое: $ip=gethostbyname($host); echo gethostbyaddr($ip); Корректный перевод IP-адреса в доменное имя Функция gethostbyaddr() на первый взгляд проста и привлекательна, но с ней связан один нюанс, который до недавнего времени было принято игнорировать. Дело в том, что при поиске доменного имени машины по заданному IP-адресу PHP обращается к хосту по этому адресу и запрашивает у него доменное имя. Если хостом Разрешение IP-адреса в доменное имя и наоборот string gethostbyaddr(string $ip address) Функция возвращает доменное имя хоста, заданного своим IP-адресом. В случае ошибки возвращается $ip address. 0 1 2 3 4 5 6 7 8 9 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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 [ 126 ] 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |