Многие уже наслышаны о революции в расширении HTTP протокола — внедрении технологии WebSocket разработчиками Google Chromium. В данной статье речь пойдет о том, как приручить данного зверя — установке и настройке WebSocket сервера на асинхронном фреймворке phpDaemon.
Для установки нам потребуется PHP5 CLI >= 5.3 с поддержкой pcntl, shmop и sockets.
Получаем последнюю версию phpDaemon из репозитория
Учтите, что $path должно быть заменено на путь, куда устанавливается phpDaemon
Устанавливаем права запуска
Устанавливаем библиотеку libevent
Привязываем демона к команде phpd
Настраиваем файл $path/conf/phpdaemon.conf.php
Создаем пример обработчика веб-сокет запросов:
$path/applications/WebSoketWorker.php
Вуаля! Наш вебсокет сервер установлен!
Для тестирования создадим файл с следующим содержанием:
В случае успешного подключение вы должны получить сообщение «pong».
Для поддержки в отличных от Chrome браузерах используйте библиотеку web-socket-js, которая эмулирет веб-сокеты с помощью флеша.
Для установки нам потребуется PHP5 CLI >= 5.3 с поддержкой pcntl, shmop и sockets.
1. Загрузка
Получаем последнюю версию phpDaemon из репозитория
$ svn checkout http://phpdaemon.googlecode.com/svn/trunk $path/
Учтите, что $path должно быть заменено на путь, куда устанавливается phpDaemon
2. Установка
Устанавливаем права запуска
$ chmod +x $path/bin/phpdaemon
Устанавливаем библиотеку libevent
$ pecl install libevent
Привязываем демона к команде phpd
$ ln -s $path/bin/phpdaemon /usr/bin/phpd
3. Настройка
Настраиваем файл $path/conf/phpdaemon.conf.php
Copy Source | Copy HTML
- <?php
- // Включаем отображение ошибок
- error_reporting(E_ALL);
- ini_set('display_errors','1');
-
- return array(
- 'mod-websocketserver-enable' => 1, // Включаем веб-сокет сервер
- 'mod-websocketserver-listen' => 'tcp://0.0.0.0', // Слушаем все IP
- 'mod-websocketserver-listenport' => 8047, // Вешаем на отличный от 80, чтобы не конфликтовать с другими веб-серверами
- 'max-requests' => 1000, // Максимальное количество запросов
- 'max-idle' => 0, // Максимальное время простоя
- 'user' => 'www', // Пользователь
- 'group' => 'www', // и группа под которыми запускается демон
- 'min-spare-workers' => 5,
- 'max-spare-workers' => 20,
- 'start-workers' => 1,
- 'max-workers' => 50,
- 'min-workers' => 1,
- 'path' => dirname(__FILE__).'/appResolver.php'
- );
-
- ?>
Создаем пример обработчика веб-сокет запросов:
$path/applications/WebSoketWorker.php
Copy Source | Copy HTML
- <?php
- return new WebSocketWorker;
- /**<br/> * WebSocket Обработчик<br/> *<br/> */
- class WebSocketWorker extends AppInstance {
- /**<br/> * WebSocket Сервер<br/> * @var WebSocketServer<br/> */
- public $ws;
- /**<br/> * Инициализация обработчика<br/> */
- public function onReady() {
- $this->ws = Daemon::$appResolver->getInstanceByAppName('WebSocketServer');
- if ($this->ws) {
- $this->ws->routes['myRoute'] = array($this,'openSession');
- }
- }
- /**<br/> * Открытие новой сессии<br/> * @param $client<br/> */
- public function openSession($client) {
- return new WebSocketWorkerSession($client);
- }
-
- }
- /**<br/> * Websocket Сессия<br/> *<br/> */
- class WebSocketWorkerSession {
- public $client;
- /**<br/> * Инициализация<br/> * @param $client<br/> */
- public function __construct($client) {
- Daemon::log('connected');
- $this->client = $client;
- }
- /**<br/> * Получение сообщения<br/> * @param $data - тело сообщения<br/> * @param $type - тип сообщения<br/> */
- public function onFrame($data,$type) {
- Daemon::log($data);
- if ($data === 'ping') {
- $this->client->sendFrame('pong');
- }
- }
- /**<br/> * Закрытие сессии<br/> */
- public function onFinish() {
-
- }
- }
- ?>
Вуаля! Наш вебсокет сервер установлен!
4. Тестирование
Для тестирования создадим файл с следующим содержанием:
Copy Source | Copy HTML
- <script type="text/javascript">
- <!--
- if ("WebSocket" in window) {
- var ws = new WebSocket("ws://127.0.0.1:8047/myRoute");
- ws.onopen = function() {
- // Web Socket подключён. Вы можете отправить данные с помощью метода send().
- ws.send("ping");
- };
- //каждый раз, когда браузер получает какие-то данные через веб-сокет
- ws.onmessage = function (evt) {
- alert('Получили сообщение: ' + evt.data );
- };
- ws.onclose = function() {
- // websocket закрыт.
- };
- } else {
- // для браузеров не поддерживающих WebSocket.
- alert('Ваш браузер не поддерживает вебсокеты');
- }
- //-->
- </script>
В случае успешного подключение вы должны получить сообщение «pong».
Для поддержки в отличных от Chrome браузерах используйте библиотеку web-socket-js, которая эмулирет веб-сокеты с помощью флеша.