PHP может открывать соккеты на локальной или удаленной машине. В данной статье будет рассмотрен пример использования соккетов для: соединения с Usenet-новостным сервером, ведения диалога с ним и скачивания некоторых статей.
Открываем соккет.
Для открываения соккета используется функция fsockopen(). Эта функция доступна, как в PHP3, так и PHP4. Вызов функции имеет следующий вид:
int fsockopen (string hostname, int port [, int errno [, string errstr [, double timeout]]])
Для UDP соединения, надо определить протокол: udp://hostname.
Этот документ детально описывает процедуру соединения и диалога с сервером.
Соединение (Connecting)
Для соединения с NNTP-сервером нам необходимо знать его имя (или IP-адрес) и порт.Так же необходимо указывать таймер, чтобы в случае невозможности подсоединения к серверу не “заморозили” application.
Итак, теперь мы присоединились к серверу и можем вести диалог с ним, используя ранее открытый соккет. Для примера, попробуем достать десять последних сообщений с какой-либо группы. В RFC977 описано, что первый шаг – выбрать группу с помощью комманды:
GROUP ggg
Обязательный парамтор - ggg - имя группы, которую мы хотим выбрать (например, "net.news"). Список существующих групп может быть получен с помощью комманды LIST.Удачный выбор группы будет подтвержден ответом сервера, где будет сообщаться колличество новых, старых статей и общее колличество.
chrome:~$ telnet my.news.host 119 Trying aa.bb.cc.dd... Connected to my.news.host. Escape character is '^]'. 200 my.news.host InterNetNews NNRP server INN 2.2.2 13-Dec-1999 ready (posting ok). GROUP alt.test 211 232 222996 223235 alt.test quit 205 .
После получения комманды "GROUP alt.test", новостной сервер ответил "211 232 222996 223235 alt.test". 211 – определенный RFC спецификацией код (говоря обычным языком – 212 – означает, что команда была завершена с положительным результатом – смотрите документацию RFC для более полной характеристики). Следующая цифра – 232 – колличество имеющихся в текущий момент новых статей. 222996 – старых. 223235 – всего статей. 232+222996 не равно 223235. Почему? Возможно, недостающие семь статей были каким-либо образом удалены модератором или самим автором.
В зависимости от сервера (public или private вас могут попросить идентифицироваться. Так-же возможно, что идентификация понадобиться только при написании своих сообщений, а чтение может производиться без этого.
Теперь мы имеем номер последней статьи, так что сейчас нам не составит труда скачать десять последних статей. RFC977 спецификация допускает использование комманды ARTICLE, как с номером статьи, так и Message ID (Уникальный Номер Сообщения).
Будтье внимательны здесь – номер статьи отличен от Message ID. Если статья опубликованна на нескольких серверах, то она несомненно будет иметь разный номер оба раза, но одинаковый Message ID. Грубо говоря, номер статьи – присваивается каждый раз по-новому на сервере, и может меняться со временем; Message ID – у каждой статьи уникальный.
Мы только что видели как открыть, использовать и затем закрыть соккет – для соединения с NNTP-сервером и получения некоторых статей из новостных групп.
Для опубликования сообщения необходимо использовать POST комманду.