Php проверка работы сокетов

Обновлено: 04.07.2024

Примечание. Сокеты у нас будут работать, как на серверной части, так и на клиентской. На серверной части этим займется стандартный WebSocket, который появился в HTML5, а работу на серверной части, где у нас PHP будет выполнять библиотека phpws. Есть много подобных библиотек, пожалуй, особенно следует отметить Ratchet, который мне показался громоздким для моего маленького проекта и я остановился на phpws.

Нам нужен Composer

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

Мы его скачали, но команды composer не будут выполняться через PATH, поэтому переместим скачанное в /usr/local/bin

Выполняем команду и получаем результат в виде инструкций и команд Composer, что говорит об удачной установке

Для Windows и Mac можно посмотреть инструкцию на офф-сайте.

Примечание. Все зависимости, которые нужно подключать надо указывать в файле composer.json в корне проекта, который скачает, обновит и соберет все зависимости в одну папку vendor, из которого потом можно загружать через автозагрузчик классов. У Composer есть свое хранилище пакетов и библиотек и называется Packagist, который позволяет указывать vendor/package и он будет установлен. Да, можно указывать конкретные адреса svn/git репозиториев в composer.json, но это неудобно. Намного удобнее иметь какой-то центральный пункт, где есть соответствия пакетов с их адресами репозиториев. Это Packagist.

Нам нужна библиотека phpws

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

В данном случае, мы указали, что скачивать прямо с репозитория GitHub без посредничества Packagist.

Выполним данный файл командой

После чего в папке появится подпапка vendor со скачанными библиотеками и нам остается их подключить и использовать.

Нам нужны базовые понимания работы WebSocket с PHP

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

Для клиентской части:

Для серверной части:

Стандартный пример вывода текущего времени сервера с обновлением до секунды

Для работы данного примера нужно единожды запустить файл server.php через консоль и после выполнения данного скрипта запуститься сокет-сервер со своим PID

Что делает пример? В примере показано, как до долей секунды сокет обновляет информацию времени на сервер и выдает его клиенту

Стандартный пример простого чата

Показан пример простого чата. Визуально он имеет вид, как на картинке

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

Сначала выводим PID процесса запущенного сокет-сервера. Его мы узнаем посмотрев список запущенных сокетов через их порты через команду:

Находя из списка нужный PID убиваем его через команду:

Сокеты: Клиент на PHP

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

Привожу код клиента на PHP:

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


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

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

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

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

Она выглядит вот так:

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

Михаил,вы сами проверяли свой скрипт клиента относительно серверу? Вот нмпример строка $result = socket_connect($socket, $address, $port); как она должна подключаться если переменной $socket нет,а есть $sock. Или я ошибаюсь?=)

Для начала с примером в статье и разберитесь. Как именно реализовать это для игрового сервера, это уже другой вопрос.

Не подключается, возможно, сервер не сделали, чтобы было куда подключаться.

Вроде все сделал правильно! Если в браузере отткрыт фаил "server.php" то все срабатывает нормально, но только один раз. Что можно сделать? Я вроде все установил как надо

Михаил, Здравствуйте. Я сохранил код сервера и код клиента, затем открыл вкладку в браузере через которую запустил код сервера, а потом запустил код клиента и все работает замечательно, но почему-то всего лишь один раз, если запустить код клиента еще один раз, то лезут ошибки "socket_connect(): unable to connect [10061]: No connection could be made because the target machine actively refused it." Пробовал не закрывать соединение как на сервере так и на клиенте, код не работает, а точнее лезут опять же ошибки. Как запустить сервер так, чтобы я мог в любое время обращаться к нему? Если обращаться к серверу через HTML5 websocket нужно ли серверу отправлять заголовки о том, что он поддерживает сокеты? И в какой части кода они должны отправляться? Заранее очень благодарен за ответы!

Уважаемый админ ответьте пожалуйста на два предыдущих комента почему нормально срабатывает только один раз. Спс.

Когда говорят сокет, то часто представляют себе что-то абстрактное, и связанное с сетевыми передачами. Но если выразится конкретнее, то получится что сокет, например, как протокол IP, это совокупность адреса (хоста) и порта. Адрес (хост) на текущий момент представляет из себя 32-x битный адрес. Наиболее часто его представляют в символьной форме mmm.nnn.ppp.qqq (адрес, разбитый на четыре октета по одному байту в октете и разделенный точками). Порт - это номер порта в диапазоне от нуля до 65535. Так вот, эта пара и есть сокет (гнездо в в котором расположены адрес и порт). В процессе обмена, как правило используются два сокета - сокет отправителя и сокет получателя.

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

Что же делают сокеты? С помощью сетевых протоколов они обмениваются между собой запросами. Существуют такие виды сетевых протоколов:
TCP - протокол управления передачей (Transmission Control Protocol).
TCP/IP - (Transmission Control Protocol/Internet Protocol) - набор сетевых протоколов, позволяющих компьютерам (различных аппаратных платформ и с разными операционными системами) взаимодействовать по соединенным сетям и через Интернет. Любой компьютер в Интернете поддерживает tcp/ip. Это базовый протокол, используемый Internet.
UDP - дополнительный компонент протокола tcp, поддерживающий выполняющуюся без подключений службу датаграмм, не гарантирующую ни доставку, ни правильную последовательность доставленных пакетов (аналогично протоколу ip).
FTP - один из протоколов tcp/ip, используемый для копирования файлов с одного компьютера на другой через Интернет. При этом оба компьютера должны поддерживать соответствующие роли ftp: один должен быть клиентом ftp, а другой - сервером ftp.
SSL - протокол, обеспечивающий защиту передаваемых данных с помощью шифров.
TLS - стандартный протокол, используемый для обеспечения безопасности веб коммуникаций в Интернете и интрасетях. Позволяет клиентам проверять подлинность серверов или (необязательно) серверам проверять подлинность клиентов. Также обеспечивает безопасный канал за счет шифрования соединений. Протокол tls является самой последней и более безопасной версией протокола ssl.
SMTP (Simple Mail Transfer Protocol) - что означает простой протокол передачи электронной почты;
POP (Post Office Protocol) - почтовый протокол для приема электронной почты.

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

Запрос клиента начинается с команды GET. Каждый сервер должен поддерживать как минимум две команды GET и HEAD. Посмотрите какие еще существуют основные команды:
GET - используется для запроса содержимого указанного ресурса (страницы). В результате этой команды сервер должен выполнить запрос и возвратить ответ. Как правило, все клиенты (браузеры) для получения страницы сайта по url используют get.
HEAD - аналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело. Другими словами обратно Вы получите только заголовок ответа сервера, но не код страницы.
POST - применяется для передачи пользовательских данных заданному ресурсу. Эти данные могут быть в виде файла или просто текста. Как правило, название переменной и ее значение.
TRACE - возвращает полученный запрос так, что клиент может увидеть, что промежуточные сервера добавляют или изменяют в запросе.

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

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

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

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

Репутация: 6
Всего: 18

Сокеты в PHP. Пособие для начинающих.

Для взаимодействия с сокетами в PHP чаще всего используется функция fsockopen, синтаксис которой приведён ниже.

Больше не будет теоретизировать, сразу перейдём к практике.

Распространённые примеры использования сокетов.

Пример 1. Передаём данные и получаем страницу.

Создайте php-скрипт следующего содержания:

Теперь напишем скрипт обращения к странице и передачи переменных.

Теперь, когда создан сокет, мы может получать и передавать информацию по нему с помощью функций, используемых для работы с файлами (fread(), fwrite(), fgets(), feof()).
Этим и займёмся.

Не буду сдаваться в подробности того, какие заголовки вывел сервер, всё это вы можете прочитать в документации.

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

P.S. Довольно часто получать содержание страницы в Интернете пытаются функциями наподобие file() и file_get_contents(). Почему этого не стоит делать, читайте здесь.

Пример 2. Определить, существует ли страница в Интернете.

Довольно популярный вопрос, который обычно пробуют решать примерно так:

Справедливости ради, следует отметить, что сервер, не найдя страницу может и не возвращать 404. Вполне возможно, что он редиректнет нас, причем возвратит код 200.
Здесь приведён простейший пример, в реальных условиях, возможно, потребуются дополнительные проверки.

Пример 3. Передаём данные на сервер методом POST, не используя HTML-форму.

Самый животрепещущий вопрос на тему сокетов .
Добавьте в скрипт, к которому мы обращались в прошлом примере строчку

Сейчас будем ловить POST-данные.

Теперь наш запрос к серверу будет выглядеть таким образом:

Разберём этот запрос. Вот он:

Рассмотрим, чем этот запрос отличается от запроса из предыдущего примера.
Прежде всего, в первой строке используется "POST", а не "GET". Это значит, что после двух переносов строки будут идти данные, которые сервер, возможно, передаст PHP-интерпретатору. Кроме того, среди заголовков есть два новых для нас.

Content-length
Пример: Content-length: 2452
Длина данных, которые, грубо говоря, будут переданы после двух переносов строки. Используется, когда сервер отвечает на запрос или, как в нашем случае, если передаются POST-данные. Размер переданных данных должен быть обязательно равен этому значению.
На основе этого заголовка создается переменная окружения CONTENT_LENGTH.

Content-Type
Пример: Content-Type: text/html
Задаёт тип документа и его кодировку. Для передачи данных методом POST мы использовали application/x-www-form-urlencoded.

Чтобы передать несколько переменных методом POST, перечислите их через символ «&» (совсем как в GET), например:

Полезные ссылки

Linux is like wigwam -- no windows, no gates, apache inside.

Репутация: 4
Всего: 9

несколько не верен.

resource fsockopen ( string target [, int port [, int &errno [, string &errstr [, float timeout]]]] )

Во-первых, функция возвращает ресурс. Т.е. идентификатор соединения.
И опущен параметр timeout, он устанвливает время в течении которого мы будем пытаться соединится с ресурсом. Если в течении указанного времени соединение установить не удалось, идентификатор соединения не будет создан.

Репутация: 6
Всего: 18

Linux is like wigwam -- no windows, no gates, apache inside.

Репутация: 6
Всего: 18

Linux is like wigwam -- no windows, no gates, apache inside.

Репутация: 12
Всего: 43

Если честно, то тема абсолютно не раскрыта =(

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

Репутация: 46
Всего: 140

Неплохая статья на мой взгляд. держи +1

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь
  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

[ Время генерации скрипта: 0.1201 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Читайте также: