Працюємо з phpdaemon, підручник html5

Сервери FastCGI, HTTP, CGI, FlashPolicy, Telnet, клієнти mysql, memcached, mongodb - ось неповний список функціоналу, реалізованого в цьому демона, створеному російським програмістом Василем Зоріна.

Втім, нас зараз цікавлять тільки WebSocket, і це phpDae-mon теж вміє. Процес установки фрейворка має свої нюанси, тому зупинимося на ньому трохи докладніше.

PhpDaemon вимагає для своєї роботи бібліотеку libevent - це кроссплатформенная бібліотека для асинхронної роботи з мережею, що надає механізм, який використовує функції зворотного виклику. У репозиторії Pecl є розширення для роботи з libevent за допомогою php, але, щоб його зібрати, нам, можливо, знадобиться утиліта phpize з пакета php-devel. Втім, ця обставина нас не повинно зупиняти.

$ Sudo aptitude install php5-dev

Це природно для користувачів Debian або Ubuntu. Якщо у вас Red Hat, Fedora або CentOS, команда буде:

$ Sudo yum install php53-devel

Якщо ви використовуєте Windows ... ну, в загальному, краще поставити віртуальну машину.

Далі встановлюємо розширення libevent (сама бібліотека повинна бути вже встановлена):

Pecl install libevent

Після установки необхідно в php. ini прописати наступний рядок, якщо її немає в наявності:

(Нам важливо це зробити для cli-інтерпретатора, тобто шлях до конфігураційного файлу буде виду: / etc / php5 / cli / php. Ini.)

І нарешті, встановлюємо PhpDaemon:

Git clone git: // github. com / kakserpom / phpdaemon. git chmod + x phpdaemon / bin / phpd

Ln - s / usr / local / phpdaemon / bin / phpd / usr / bin / phpd

Ln - s / usr / bin / phpd / etc / init. d / phpd update-rc. d phpd defaults

Хоча з запуском ми напевно поквапилися, і, можливо, в консоль виваляться кілька помилок. Це не біда, зараз все виправимо. Перш за все редагуємо файл конфігурації - phpdaemon / conf / phpd. conf. Він повинен буде виглядати приблизно так:

User root; group root;

ServerStatus

Privileged; enable 1; listen-port 8080:

ExampleWebSocket

Path / usr / local / lib / phpdaemon / applications / ExampleWebSocket. php:

Listenport 8047; user www;

WebSocketOverCOMET

Path = / usr / local / lib / phpdaemon / AppResolver. php

Include conf. d / *. conf:

Я тут не буду зупинятися на деталях настройки середовища phpdaemon, весь конфігураційний файл я привожу тільки для того, щоб його можна було без змін використовувати в своїх дослідах читачеві. Найбільш важливі конструкції Server і Example-WebSocket. Перша з них вимикає веб-сокети, друга реєструє тестове додаток. Параметр path вказує на його фізичне розміщення.

Дуже важливим параметром конфігурації є рядок

Path = / usr / local / lib / phpdaemon / AppResolver. php,

Показує наш шлях до ні перетворювати-файлу (файлу, разбирающего запити і зв'язує їх з додатком). Сам цей файл у нас буде максимально простий:

Тепер ми перейнятися клієнтською частиною. У дистрибутив phpdae-mon входить хороший інструментарій для тестування технологій. В папці phpdaemon / clientside-connectors / websocket / знаходяться набір js-файлів і приклад html-сторінки, що працює з веб-сокетами, що вимагає мінімальної настройки (рис. 105). Причому для браузерів, які не підтримують WebSocket, виконана емуляція процесу з використанням технологій COMET / Long Pooling і навіть flash. Але нам це не дуже цікаво, не шукатимемо легких шляхів і напишемо свій WebSocket-клієнт:

Function messageEvent (msg)

Function closeEvent ()

Працюємо з phpdaemon, підручник html5

Мал. 105. Працюємо з WebSockets

Тут ми бачимо три кнопки, перша з яких створює сокет (і, відповідно, встановлює з'єднання), викликаючи функцію WebSocketConnection, яка, в свою чергу, створює об'єкт WebSocket (), параметром конструктора якого є url нашого WebSocket-додатки. Другий, необов'язковий параметр - протокол, їх може бути кілька.

Після установки з'єднання (нас сповістить про це відповідний alert) можна скористатися кнопкою Send ping, яка посилає повідомлення в сокет. При отриманні повідомлення з боку сервера спрацьовує подія onmessage, в результаті якого в нашому випадку буде виведено повідомлення з відповіддю сервера (рис. 106). Кнопка Close WebSocket закриває сокет - поле цього взаємодія

З сервером припиняється. Дані надсилаються і приймаються у вигляді рядків, але ніщо не заважає обмінюватися і JSON-об'єктами:

Function sendText () Type: "message", text: "Hello WebSockets.!", Id: clientID, date: Date. now ()

WS. send (JSON. stringify (msg));

Мал. 106. Відповідь через WebSocket

Словом, все, як у звичайному клієнт-серверному веб-взаємодії. Як виглядає серверна частина, нас, строго кажучи, не повинно цікавити, але давайте поглянемо на її реалізацію просто для загального розвитку.

* Called when new frame received.

* @param string Frame's contents.

* @param integer Frame's type.

Public function onFrame ($ data, $ type) $ This-> client-> sendFrame ( 'pong', WebSocketSERVER :: STRING, function ($ client)

Daemon :: log ( 'ExampleWebSocket:' pong 'received by client.');>

Перший з них викликається при створенні веб-сокета і повертає об'єкт нового сеансу роботи з ним. Другий є реалізацією цього сеансу і містить метод onFrame, що приймає повідомлення і відсилає відповідь.

Що ми можемо тепер отримати, виходячи з наявного арсеналу засобів? Та практично все, перешкод у вигляді HTTP-протоколу більше немає. Вірніше, сам HTTP нікуди не подівся, але особливості його архітектури - більше не перешкода. Перешкода в іншому - слабкою поки підтримці технології як в браузерах, так і на веб-серверах. Але, я думаю, ніхто не сумнівається, що це все тимчасово. Набагато більш істотним виглядає інший, «вроджений» недолік технології - відсутність обмеження терміну життя запиту. Справа в тому, що WebSockets - це TCP-сокет, а не HTTP-запит, він не має природи «запит / відповідь на запит», і це, крім переваг, має і зворотну сторону - незручність роботи сервісів, обмежених одним запитом. Ну що ж, срібної кулі не існує, просто розробнику треба завжди мати на увазі таку поведінку при взаємодії з сервером.

Вам також можуть бути цікаві такі статті: