Функция file() (равно как и fopen() ) позволяет нам работать только с содержимым файла, который получен по тому или иному протоколу. Предположим, что нас интересуют заголовки, переданные сервером. Получить эти заголовки мы можем с помощью функции
int fsockopen(string $host, int $port, [, int &$errno] [, string &$errstr])
Данная функция позволяет инициализировать потоковое соединение с указанным хостом и программой, которая связана с указанным портом. Кроме того, эта функция поддерживает Unix-сокеты. При этом параметр $hostname будет использован как путь к файлу сокета, а параметр $port должен быть равен 0.
После установления соединения функция возвращает обыкновенный дескриптор файла. С этим дескриптором могут работать функции fread(), fwrite(), fgets(), feof() и другие.
В случае ошибки функция возвратит false и, если указаны необязательные параметры $errno и $errstr, соответственно, номер ошибки и текст сообщения об ошибке.
Рассмотрим листинг 3 – «Виртуальный браузер»: мы посылаем серверу HTTP-запрос GET и, получив ответ, выводим его в броузер.
Листинг 3. «Виртуальный браузер» <? // Подключаемся к серверу 1. $fsoc = fsockopen("localhost",80); 2. fputs($fsoc, "GET / HTTP/1.0\n\n"); 3. echo "<pre>"; 4. while (!feof($fsoc)) 5. echo HtmlSpecialChars(fgets($fsoc,1000)); 6. echo "</pre>"; // Отключаемся от сервера 7. fclose($fsoc); ?>
Как я уже отмечал выше, при использовании функции fsockopen мы получаем весь ответ сервера – вместе с заголовками. Функцию HtmlSpesialChars() мы используем для корректного отображения HTML-кода в текстовом формате. В броузере мы должны получить примерно следующее: HTTP/1.1 200 OK Date: Sat, 16 Mar 2002 10:46:59 GMT Server: Apache/1.3.12 (Linux) Last-Modified: Sat, 20 Nov 1999 13:29:40 GMT ETag: "0-574-3836a244" Accept-Ranges: bytes Content-Length: 1396 Connection: close Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> sp;<HEAD> <TITLE>Test Page for Apache Installation</TITLE> </HEAD> ...