Статьи,обзоры,справочники по PHP

       

Работа с сокетами


Функция 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> ...


Ответ сервера HTTP/1. 1 200 OK соответствует коду ответа 200 и означает безошибочное выполнение операции (в данном случае передачи документа по запросу GET).

Установить нужный нам заголовок ответа мы можем с помощью функции Header(). Например, Header("Location://www.softerra.ru/freeos");
Запретить кэширование можно с помощью установки заголовка Pragma: no-cache. К сожалению одного этого заголовка явно не хватит для запрещения кэширования. Для полного запрета нужно использовать целых четыре заголовка. Установить с помощью Header их можно так:


  1. Header("Pragma: no-cache");
  2. Header("Cache-control: no-cache, must-revalidate");
  3. Header("Expires: Mon, 01 Jan 1990 01:01:01 GMT");
  4. Header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT");


Первый из них устанавливает заголовок запрета кэширования согласно протокола HTTP/1.0, а второй – HTTP/1.1. Третий определяет задает дату в прошлом, а четвертый устанавливает дату последнего обновления документа. Функция gmdate() возвращает дату в нужном нам формате. Устанавливать все четыре заголовка крайне желательно, так как запрет кэширования может не сработать или на прокси-сервере или в броузере, и пользователь получит устаревшую версию документа.


Содержание раздела