В данной статье рассмотрим работу с библиотекой phpws , которая нужна для организации приложений или WEB — приложений на основе сокетов и запустим парочку стандартных примеров, которые представлены на странице репозитория GitHub данного проекта.
Примечание. Сокеты у нас будут работать, как на серверной части, так и на клиентской. На серверной части этим займется стандартный WebSocket, который появился в HTML5, а работу на серверной части, где у нас PHP будет выполнять библиотека phpws. Есть много подобных библиотек, пожалуй, особенно следует отметить Ratchet , который мне показался громоздким для моего маленького проекта и я остановился на phpws.
Нам нужен ComposerОчень удобная штука, которая облегчит всю работу с зависимостями и библиотеками, которые включены в проекты. По всеобщему стандарту кодирования или, проще говоря, по правильному написанию кода все библиотеки, пакеты, зависимости или проекты принято хранить в репозиториях исходных кодов, которые потом подключаются в проект за парочку команд через менеджеры пакетов или через менеджеры зависимостей. Для каждого языка есть свой менеджер или почти для каждого, поэтому, вооружимся данным инструментом и установим его в систему командой в Linux
$ curl -s https://getcomposer.org/installer | php
Мы его скачали, но команды composer не будут выполняться через PATH, поэтому переместим скачанное в /usr/local/bin
$ mv composer.phar /usr/local/bin/composer
Выполняем команду и получаем результат в виде инструкций и команд Composer, что говорит об удачной установке
$ composer
Для Windows и Mac можно посмотреть инструкцию на офф-сайте .
Примечание. Все зависимости, которые нужно подключать надо указывать в файле composer.json в корне проекта, который скачает, обновит и соберет все зависимости в одну папку vendor, из которого потом можно загружать через автозагрузчик классов. У Composer есть свое хранилище пакетов и библиотек и называется Packagist , который позволяет указывать vendor/package и он будет установлен. Да, можно указывать конкретные адреса svn/git репозиториев в composer.json, но это неудобно. Намного удобнее иметь какой-то центральный пункт, где есть соответствия пакетов с их адресами репозиториев. Это Packagist .
Нам нужна библиотека phpwsДля подключения к проекту, нам нужно зайти в корень папки проекта или в подпапку, если это будет частью проекта и там установить данную библиотеку, но сначала надо создать в этом месте composer.json, который выполним потом через консоль командами composer и он прочитав, все нам установит. Для этого создаем данный файл со следующим содержимым
{ "repositories": [ { "type": "vcs", "url": "https://github.com/Devristo/phpws" } ], "require": { "devristo/phpws": "dev-master" } }
В данном случае, мы указали, что скачивать прямо с репозитория GitHub без посредничества Packagist.
Выполним данный файл командой
$ composer install
После чего в папке появится подпапка vendor со скачанными библиотеками и нам остается их подключить и использовать.
Нам нужны базовые понимания работы WebSocket с PHPИ так, на минуточку разберемся, что делать со скачанными библиотеками и как их использовать, углубляться не буду, поэтому, если на пальцах, то нам нужно 2 файла:
Для соединения нам надо указать схему соединения или протокол связи, ip — адрес сервера. Если удаленный сервер, то надо указать ip — адрес хоста или VPS, а если локальный, то localhost, который равен адресу 127.0.0.0 и указываем еще порт, на котором служба сервера будет запущена под собственным PID. Все эти данные указываются при создании экземпляра соединения.
Для клиентской части:
Var socket = "ws://127.0.0.0:12345/";
Для серверной части:
$server = new WebSocketServer("tcp://127.0.0.0:12345", $loop, $logger);
Стандартный пример вывода текущего времени сервера с обновлением до секундыДля работы данного примера нужно единожды запустить файл server.php через консоль и после выполнения данного скрипта запуститься сокет-сервер со своим PID
Что делает пример? В примере показано, как до долей секунды сокет обновляет информацию времени на сервер и выдает его клиенту
Клиентская часть:
Timers Server Time Status: Time:
Var socket = new WebSocket("ws://localhost:12345"); socket.onopen = function(msg){ document.getElementById("status").innerHTML = "Online"; }; socket.onclose = function(msg){ document.getElementById("status").innerHTML = "Offline"; } socket.onmessage = function(msg){ document.getElementById("time").innerHTML = msg.data; };
Серверная часть:
#!/php -q
Скрипт «Сервер».Для реализации сервера нам понадобятся следующие функции работающие с сокетами:
Листинг 1.1 — Сервер
Set_time_limit(0); ob_implicit_flush(); echo "- Сервер
";
$address = "127.0.0.1"; $port = 5555;
echo "Создание сокета... "; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($socket "; } else { echo "OK
"; }
echo "Привязывание сокета... "; $bind = socket_bind($socket, $address, $port); if($bind "; } else { echo "OK
"; }
echo "Прослушивание сокета... "; $listen = socket_listen($socket, 5); if($listen "; } else { echo "OK
"; }
while(true) { echo "Ожидаем... "; $accept = socket_accept($socket); if($accept "; break; } else { echo "OK
"; }
$msg = "Hello, Клиент!"; echo "Отправить клиенту \"".$msg."\"... "; socket_write($accept, $msg, strlen($msg)); echo "OK
";
while(true) { $awr = socket_read($accept, 1024); if (false === $awr) { echo "Ошибка: ".socket_strerror(socket_last_error())."
"; break 2; } else { if (trim($awr) == "") break; else echo "Клиент сказал: ".$awr."
"; }
if ($awr == "exit") { socket_close($accept); break 2; }
echo "Сказать клиенту \"".$msg."\"... "; socket_write($accept, $awr, strlen($awr)); echo "OK
"; }
}
if (isset($socket)) { echo "Закрываем соединение... "; socket_close($socket); echo "OK
"; } ?>
Вот собственно и всё. Вначале запустите скрипт сервер, он создаст, привяжет, начнёт прослушивание сокета и установится в режим ожидания клиента. Далее запустите клиента.
Так же хочу отметить что наиболее полезной является функция:
socket_select
(array read, array write, array except, integer timeout_seconds, integer timeout_microseconds); — Функция контролирует изменения происходящие на узлах. PHP просматривает поступления новых дынных на сокетах, заданных в массиве read. PHP просматривает готовность к приёму данных на сокетах, заданных в массиве write. PHP просматривает на наличие ошибок потоки, заданные в аргументе except. В таймаутах задается время, по истечению которого функция будет возвращать кол-во сокетов изменивших своё состояние или FALSE.
Эта функция не заменима для мониторинга клиентов висящих на сокете.
В статье приведена малая часть всех функций работающих сокетами, кого заинтересовало, откапывайте мануалы, читайте… Удачных экспериментов…
Антивирус Bitdefender: эффективный защитник Без вопросов
Значение слова неудачный
Обзор Samsung Galaxy A7 (2017): не боится воды и экономии Стоит ли покупать samsung a7
Делаем бэкап прошивки на андроиде
Как настроить файл подкачки?