что такое сокеты в php

Что такое сокет в PHP

что такое сокеты в php. Смотреть фото что такое сокеты в php. Смотреть картинку что такое сокеты в php. Картинка про что такое сокеты в php. Фото что такое сокеты в php

Не так давно меня попросили рассказать про сокеты на PHP. Вообще я планирую написать ещё несколько статей в ближайшее время по этой теме, а в этой статье я расскажу о том, что такое сокеты в PHP. Чтобы Вы уже могли понять, нужны они Вам или нет.

Кратко резюмирую, что же такое сокет: есть клиент, есть сервер, есть правила взаимодействия (интерфейс), клиент, согласно этим правилам, посылает запрос, а сервер данный запрос принимает и, согласно тем же правилам, даёт ответ.

Как видите, всё совсем не сложно. Очень здорово то, что клиент и сервер могут быть написаны на совсем разных языках программирования и могут находиться друг от друга за тысячи километров. Мы же с Вами будет писать и клиент, и сервер в будущих статьях на языке PHP.

что такое сокеты в php. Смотреть фото что такое сокеты в php. Смотреть картинку что такое сокеты в php. Картинка про что такое сокеты в php. Фото что такое сокеты в php

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Комментарии ( 2 ):

А способ взаимодействия клиента и сервера может называться протоколом? Например ftp.

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.

Источник

Делаем вебсокеты на PHP с нуля

Некоторое время назад я выбирал библиотеку для работы с вебсокетами. На просторах интернета я натыкался на статьи по интеграции node.js с yii, а почти все статьи о вебсокетах на хабре ограничивались инструкциями к тому, как использовать phpdaemon.

Я изучал библиотеки phpdaemon и ratchet, они достаточно монструозны (причём используя ratchet для отправки сообщения конкретному пользователю рекомендовано дополнительно использовать wamp). Мне не совсем было понятно для чего использовать таких монстров, которые требуют установку других монстров. Почитав исходники этих, а также других библиотек, я разобрался как всё устроено и мне захотелось написать простой вебсокет-сервер на php самостоятельно. Это помогло мне закрепить изученный материал и наткнуться на некоторые подводные камни, о которых я не имел представления.

Так я решил написать необходимый для меня функционал с нуля.

Получившийся код и ссылка на демонстрационный чат в конце статьи.

Поставленные цели:

1) разобраться с серверными сокетами в php
2) разобраться с протоколом вебсокетов
3) написать с нуля простой сервер вебсокетов

1) Серверные сокеты в php

До этого момента я имел смутные представления о серверных сокетах. Почитав исходники нескольких библиотек для работы с вебсокетами я столкнулся с двумя схемами их реализаций:

используя расширение php «socket»:

или используя расширение php «stream»:

Я предпочёл второй вариант ввиду его краткости.

Итак, мы создали серверный сокет и теперь хотим обрабатывать новые соединения к нему, для этого опять же есть два варианта

или с использованием stream_select

Т.к. нам в дальнейшем нужно будет одновременно обрабатывать и серверный сокет на предмет новых соединений, и уже существующие подключения, на предмет новых сообщений, то остановимся на втором варианте.

2) Протокол вебсокетов

«Рукопожатие» или handshake:

Считываем значение Sec-WebSocket-Key из пришедшего заголовка от клиента, рассчитываем на его основе Sec-WebSocket-Accept и отправляем итоговый ответ:

обмен сообщениями

Простой сервер вебсокетов

Итак, у нас есть вся необходимая информация.
Используя код простого http сервера из первой части, а также функции handshake, decode и encode из второй мы можем собрать простой сервер вебсокетов.

В приведённом примере можно менять пользовательские сценарии onOpen, onClose и onMessage для реализации необходимого функционала.

Поставленные цели достигнуты.
Если этот материал вам покажется интересным, то в следующей статье я опишу как можно запускать несколько процессов для обработки соединений (один мастер и несколько воркеров), межпроцессное взаимодействие, интеграцию с вашим фреймворком на примере компонента yii.

Источник

PHP: Программирование сокетов

Сокеты представляют собой чрезвычайно удобную, но в то же время плохо понятую технологию взаимодействия между двумя процессами в сети. Эти процессы могут существовать на одной и той же машине, общаясь друг с другом через локальный сокет, предназначенный для взаимодействия между процессами, либо на разных машинах через Internet. Хотя тема сокетов очень обширна, в данной статье представлены основы, которые необходимы для использования расширений РНР, предназначенных для написания собственных серверов и клиентов сокетов.

�?мейте в виду, что примеры, приведённые далее в этой статье, разработаны для запуска непосредственно из окружения оболочки с использованием версии РНР командной строки. Хотя их можно запустить в Web-браузере, делать это не рекомендуется. В случае сценариев, которые создают серверы сокетов, их применение можно продемонстрировать с помощью любых программ, способных устанавливать сетевое соединение через сокеты, например, telnet (что, собственно, и рекомендуется).

Основы сокетов

Сокеты могут быть надежными, выполняющими все необходимое для обеспечения передачи данных из точки А в точку В (TCP), либо ненадежными, когда данные передаются без гарантии доставки (UDP).

Сокеты также бывают «блокирующими» и «неблокирующими». Блокирующие сокеты заставляют ваше приложение ожидать до тех пор, пока данные станут доступны, в то время как неблокирующие сокеты этого не делают. Хотя, как будет показано далее, все сокеты двунаправлены, все же существует разница между сокетами клиента и сервера.

Мы с вами рассмотрим ТСР-сокеты Internet, поскольку они наиболее широко используются на сегодняшний день. Тем не менее, концепции и примеры кода, приведенные здесь, применимы к большинству операций с сокетами.

Создание нового сокета

Независимо от типа создаваемого сокета (клиентский или серверный), все они инициализируются одинаковым способом — с помощью функции socket_create(). Синтаксис этой функции выглядит следующим образом:

В результате выполнения эта функция либо возвращает ресурс, представляющий созданный сокет, либо булевское значение false в случае ошибки.

Константы доменов для сокеткых соединений

КонстантаОписание
AF_INETПротокол Internet IPv4
AF_INET6Протокол Internet IPv6
AF_UNIXЛокальное межпроцессное взаимодействие

После того, как домен установлен, нужно определить Т�?П подключения для создаваемого сокета. Эти типы перечислены в следующей таблице:

Константы типов сокетов

КонстантаОписание
SOCK_STREAMПоследовательный надежный двунаправленный поток, основанный на подключении. �?спользуется наиболее часто.
SOCK_DGRAMНенадежный сокет, без подключения, передающий данные фиксиро ванной длины. Очень хорош для потоков данных, в которых надеж ность не критична.
SOCK_SEQPACKETПодобен потоковым сокетам за исключением того, что данные пере даются н принимаются в виде пакетов фиксированной длины.
SOCK_RAWНеформатированное сокетное подключение, удобное для выполне ния операций ICMP (Internet Control Message Protocol — протокол управляющих сообщений Internet), таких как trace, ping и так далее.
SOCK_RDMНадежный, по непоследовательный сокет, подобный SOCK DGRAM.

Как видите, существует множество опций при выборе типа создаваемых сокетов. Вообще большинство сокетных соединений устанавливается с помощью сокетов SОСК_STREAM или SOCK_DGRAM. Учитывая очевидную полноту SOCK_STREAM (большая часть Internet работает по этому типу сокетов через TCP), может быть не совсем понятно, зачем нужны сокеты типа SOCK_DGRAM (используемые с протоколом UDP).

В конце концов, почему вообще вам может понадобиться «ненадежный» способ передачи данных? Ответ становится очевидным, когда возникает необходимость в получении постоянного потока данных, который обрабатывается в реальном времени, от сервера к клиенту. Поскольку для приложений подобного типа потерянные пакеты несущественны (поскольку такие приложения имеют дело с данными, привязанными ко времени, которые быстро устаревают), нет необходимости в повторной отправке пакетов.

Мы будем испольэовать сокеты Internet IPv4 типа SOCK_STREAM, работающие через соединения SOL_TCP (TCP), После того, как ресурс сокета создан, он может быть уничтожен с помощью функции socket_close(), имеющей следующий синтаксис:

socket_close($socket);

Ошибки сокетов

socket_last_error($socket);

socket_strerror($error_code);

Создание клиентских сокетов.

Создание сокета, готового для подключения к другому сокету в Internet, выполняется с помощью функции socket_connect ():

$socket — это сокет для записи данных;

Когда эта функция выполняется, она отправляет содержимое буфера через подключенный сокет и возвращает количество записанных байт, либо булевское значение false в случае возникновения ошибки.

Для чтения данных из сокета применяется функция socket_read<) со следующим синтаксисом:

Константы типа для socket_read()

КонстантаОписание
PHP_BINARY_READ�?нтерпретировать данные как бинарные (поумолчанию).
PHP_NORMAL_READЧитать данные заданной длины, либо пока не встретится символ новой строки (\r или \n).

В листинге ниже представлен пример использования сокетов для извлечения индексной страницы Web-сайта, в него включено все, что рассматривалось выше. �?звлечение индексной страницы осуществляется отправкой простого GET-запроса HTTP 1.0 с последующим чтением результата в переменную.

Создание серверных сокетов

Когда осуществляется привязка к адресу, убедитесь, что ваш сокет не допустит подключений к чему-либо другому, кроме указанного адреса и порта! Это означает, что привязка сокета к локальному хосту (127.0.0.1) позволит вашему сокету принимать топько покальные подключения.

Второй шаг: настроить сокет на прослушивание трафика на предмет попыток подключения к нему. Это делается с помощью функции socket_listen():

Третий и последний шаг в создании серверного сокета — дать команду на прием входящих подключений. Это делается функцией socket_accept ():

socket_accept($socket);

В листинге ниже создается простой сокетный сервер, принимающий единственное подключение, максимум 1024 байта входного потока и отображающий этот поток пользователю.

Создание простого сервера на основе сокета

У меня на компе этот скрипт лежит в папке денвера по пути: C:\WebServers\home\app.loc\www\sockets\test.php
Теперь, если запустить наш скрипт из командной строки таким макаром: C:\WebServers\home\app.loc\www\sockets>php test.php В командной строке мы увидим следующее:

Сервер в ответ пришлёт нам наш же запрос + заголовки:

В командной строке мы увидим новые данные

Чтобы создать сервер, сокеты которого ведут прослушивание на портах с номерами ниже 1000, данный пользователь должен иметь в системе административные права. Также следует отметить, что приведенный выше сценарий не завершит работу до тех пор, пока не будет установлено соединение, что может создать впечатление «зависания».

Одновременная работа с несколькими сокетами

В листинге, на предыдущей странице был представлен сервер на базе сокетов. Однако он не слишком удобен для реальных, целей, поскольку к нему может выполняться только одно подключение одновременно. Чтобы создать более удобный сервер сокетов, необходимо научиться работать одновременно с множеством сокетов. Чтобы сделать это, понадобится функция socket_select (), синтаксис которой выглядит следующим образом:

В случае ошибочного завершения socket_select() возвращает булевское значение false.

Для использования этой функции в реальном приложении первым делом должен быть создан сокет, представляющий сервер в целом. Этот главный сокет будет привязан к определенному адресу и порту и начнет прослушивание подключений.

Этот новый подключенный сокет затем подвергается мониторингу через тот же вызов socket_select() (за счет добавления его к тому же массиву, куда уже добавлен наш главный сокет) и реализуется логика приложения, обеспечивающая функциональность нашего сервера. В листинге ниже представлен работающий пример простого сервера, принимающего настраиваемое число подключений.

Создание многосортного сервера на РНР

В листинге выше вскрыты некоторые ограничения сценарного механизма РНР, которые требуют несколько более сложного обходного пути в форме вызова socket_select():

$NULL = NULL;

�? последующей ее передачи функции socket_select().

Источник

Сокеты: Сервер на PHP

что такое сокеты в php. Смотреть фото что такое сокеты в php. Смотреть картинку что такое сокеты в php. Картинка про что такое сокеты в php. Фото что такое сокеты в php

В предыдущей статье я рассказывал про сокеты на PHP. И сказал, что необходимо написать сервер, принимающий запросы и отдающий ответы. И клиента, посылающего запросы к серверу. В этой статье мы разберём код для классического сервера, принимающего число, возводящий его в квадрат и возвращающий результат клиенту.

Сразу привожу код сервера на PHP с подробными комментариями:

А в следующей статье мы с Вами напишем клиента на PHP, который и будет подключаться к данному серверу и отправлять различные запросы.

что такое сокеты в php. Смотреть фото что такое сокеты в php. Смотреть картинку что такое сокеты в php. Картинка про что такое сокеты в php. Фото что такое сокеты в php

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Комментарии ( 14 ):

У меня ошибка, пишет что функции socket_create нет.

Надо включить эту библиотеку. Для этого в php.ini расскоментируйте строчку: extension=php_sockets.dll, затем перезапустите сервер.

Дополнительные модули к Денверу установите (скачайте их с http://denwer.ru).

А что нужно именно скачать,можна ссылку ))

Дополнительные модули нужно скачать: http://www.denwer.ru/packages/php5.html

Ваш совет помог мне включить поддержку сокетов на денвере,спасибо!

После установки дополнительных модулей ошибка сохранилась.

Все отлично, но вот есть вопрос: здесь если мы получили коннект клиента, то пока он не перестанет слать что либо серверу(здесь пока не пошлет exit), другие клиенты будут как бы в очереди и не будут обрабатываться. Есть варианты одновременной обработки нескольких клиентов?

Скажите хоть. Надо ли запускать самостоятельно «server.php» или его просто надо разместить и он сам будет непрерывно работать! Опишите пожалуйста, Может из за денвера моего не х..на не работает!?

Надо запускать и сам он непрерывно работать не будет.

А как он запускается?

Скажите пожалуйста, а как его запускать. этот сокет сервер на Денвере?

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.

Источник

Что такое сокеты в php

PHP позволяет скрипту соединиться с помощью сокетов к любому хосту и порту с помощью функции fsockopen. Функция fsockopen предназначена для соединения клиента с сервером. Она очень удобна, поскольку является универсальной и объединяет в себе те функции, которые есть в PHP для работы с сокетами.

Запрос клиента:
GET /index.php HTTP/1.1
Host: master-web.com.ua
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close

Ответ сервера:
HTTP/1.0 200 OK
Date: Wed, 11 Feb 2009 11:20:59 GMT
Server: Apache
X-Powered-By: PHP/5.2.4-2ubuntu5wm1
Last-Modified: Wed, 11 Feb 2009 11:20:59 GMT
Content-Language: ru
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Connection: close

(далее следует код запрошенной страница в HTML)

Разбираем запрос клиента дальше.
После команды серверу идет часть URI запроса относительно хоста. Например, в данном случае мы запрашиваем содержимое страницы index.php, которая находится в корневом каталоге хоста. Но мы также, можем запросить и такой URI: /info/price.php?type=1 и он будет прекрасно работать.
Далее, в первой строке запроса клиента следует указание вида протокола, в данном случае он указан как HTTP/1.1 (может быть и HTTP/1.0 и HTTP/0.9), но обычно используют HTTP/1.0.
В строке (Host:) указывается название хоста к которому мы отправляем http-запрос.
В строке (User-Agent:) указывается название клиента (в данном случае одна из версий браузера Mozilla).
В строке (Accept:) указываем в каком формате мы хотим получить данные.
В строке (Connection:) мы закрываем соединение. Это является правилом хорошего тона, так как сервер при обращении к нему создает отдельное соединение, которое обслуживает все дальнейшие Ваши запросы. Однако, если его не закрыть ничего не случится, сервер закроет его сам, но через определенный промежуток времени.

Кроме вышеперечисленных строк, существует еще множество других параметров которые можно указать в запросе, но перечислять все нет смысла, Вы можете сами посмотреть вживую на обмен http-запросами между клиент-сервером, например, с помощью дополнительной утилиты (надстройки) к Mozilla Firefox «Tamper Data». Более детально запрос клиента мы еще разберем ниже.

Теперь рассмотрим ответ сервера. Первая строка ответа начинается с указания типа http-протокола, в данном случае это HTTP/1.0. Далее идет статус (код) ответа сервера. Посмотрите на таблицу с диапазонами ответов сервера:

Диапазон кодовЗначение ответа
100–199Информационный
200–299Запрос клиента успешен
300–399Запрос клиента переадресован, необходимы дальнейшие действия
400–499Запрос клиента является неполным
500–599Ошибки сервера

Список популярных ответов сервера:

КодЗначение ответа
200Запрошенный документ найден и сейчас будет выслан.
301, 302Запрошенный документ навсегда перенесен в другое расположение. При этом в поле Location будет указано новое расположение документа.
401Запрошенный документ присутствует, однако для его получения требуется авторизация на сервере.
402Запрошенный документ (страница) не найден на сервере.
500Произошла внутренняя ошибка сервера. Как правило, такие ошибки возникают при коллизиях между CGI-программой и сервером.

В нашем примере код ответа сервера имеет значение 200 OK. Это означает, что указанная в клиент-запросе страница найдена и ответ успешно возвращается. Последующие строчки, я думаю, Вам должны быть понятны интуитивно.

Что ж, мы сделали краткое вступление к понятию сокетов в php и теперь можем смело приступить к написанию нашего сокета в php.
Как я уже выше писал, для создания сокетов в php используется функция fsockopen. Посмотрите на этот код:

Выполните этот код на своем web сервере и Вы получите корневую страницу с хоста master-web.com.ua, а также заголовок ответа сервера.

Как двойной перенос строки » » отделяет http-запрос от переменных, так он и отделяет http-ответ сервера от содержимого страницы. Благодаря этому клиенты (браузера) выводят на экран страницу без заголовка ответа.

Теперь Вы можете полноценно обмениваться http-сообщениями с любым сервером, используя сокеты. При этом Вы можете послать ему любое значение одного из заголовков. Например, если Вы включаете в запрос http-заголовок «User-Agent: Opera/7.23 (Windows 98; U) [en]«, то сервер будет думать что у Вас установлена Windows 98 и работаете Вы под Operо’й. А если вы укажите такой заголовок «Referer: google.com«, то сервер решит, что Вы пришли из Гугл страницы.

Меняя значение заголовков в http-запросах, Вы можете указывать серверу любые параметры. И тогда единственным способом Вашей идентификации в интернете, будет Ваш ip-адрес. Однако в интернете, также существуют и анонимные прокси-серверы, которые могут скрывать реальный ip-адрес. Благодаря этим небольшим хитростям Вы можете посылать http-запросы на прокси-сервер, предварительно конечно проверив его анонимность, и на 99% быть уверенными, что идентифицировать Вас будет задачей довольно сложной.
Но, я думаю, Вы найдете более полезное применение сокетов на практике и создадите, например какой-нибудь полезный скрипт для авторизации на форумах, или почтовых сервисах передавая серверу необходимые данные.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *