Демоны на PHP (Денис Глазков)
Transcript of Демоны на PHP (Денис Глазков)
Демоны на PHP
Денис Глазков
Основные преимущества использования демонов на PHP
• Скорость разработки• Возможность быстро построить модель вашего сервиса• Возможности использования готовых PHP-библиотек в
коде демона• «Честное» выделение и чистка памяти
Где лучше применить PHP-демоны
• Асинхронные сервисы– Многопользовательские сервисы с мгновенным уведомлением
• Real-time многопользовательские игры (flash, websocket)
• Чаты. IM-гейты
• Сервер flashpolicy
– Фронтенд-сервер. Comet-server. Оповещение о событиях.
• Синхронные сервисы– Бэкенды. Обработчики. Кэш-сервер со сложной логикой
Отличия libevent от selectlibevent - библиотеки асинхронного неблокирующего ввода/вывода
• Работает с механизмами kqueue, epoll, poll, /dev/poll и select(2)
• Никаких пробеганий по списку в отличие от socket_select()
• Берет на себя организацию буферов на чтение/запись
• Удобное API. Работа с callback-ами
Расширение libevent для PHP• libevent.so – PECL-расширение (by Antony Dovgal)
• Запись/чтение в буфер– event_buffer_write, event_buffer_read
• Работает на callback-ах – события готовности чтения/записи
– таймауты
• PHPDaemon – Фреймворк на php
Примеры архитектурыс использованием PHP-демонов
Frontend-server
Схема frontend-backend
Frontend
php-backend
client client client client client
php-backend php-backend
DB Memcache
Несколько frontend-серверов
Несколько фронтенд-серверов
Frontend
backend
client client client client
backend backend
DB Memcache
Frontend
backend
client client client client
backend backend
Comet-сервер
nginx
client client client client
php php
comet
Проблема приложений с быстрым откликом
SERVER
CLIENT-1 CLIENT-2
xy
xy
xy
xy
xy
xy
xy
xy
xy
xyxyxy
xyxy
xy
Проблема приложений с быстрым откликом
SERVER
CLIENT-1 CLIENT-2
xy
xy
xy
xy
xy
xy
xy
xy
xy
xy
…
…
…
…
…
Посылаем периодически пустые пакеты
xy
xy
xy
xy
xy
Особенности PHP-кодинга для разработки демонов
«Экономия на спичках»
«Экономия на спичках»Конкатенация строк
'abc' . $var
"abc $var"
sprintf('abc%s', $var)
«Экономия на спичках»Разбиение строки на подстроки
list($a, $b) = explode(‘|’, $str,
2);
sscanf($str, ‘%[^|]|%s’, $a, $b);
«Экономия на спичках»Сравнение строк на вхождение
preg_match(‘/^abc/’, $var)
substr($var, 0,3) === ‘abc’
strncmp($var, ‘abc’, 3)
«Экономия на спичках»
• $a===const• if else• function• $a
VS
• $a==const• switch• class::method
• $longVariable
Чистка мусора
Чистка мусора
• Закрываем дескрипторы• Явно чистим замкнутые ссылки• unset()
PHP-демоны
• В php имеются полноценные средства для создания асинхронных сервисов с неблокирующими сокетами
• Сервисы с несложной логикой работают не намного хуже демонов на Cи
• Простота и скорость разработки