Демоны на PHP
  Денис Глазков
Основные преимущества использования
            демонов на PHP
• Скорость разработки
• Возможность быстро построить модель вашего сервиса
• Возможности использования готовых PHP-библиотек в
  коде демона
• «Честное» выделение и чистка памяти
Где лучше применить PHP-демоны
• Асинхронные сервисы
   – Многопользовательские сервисы с мгновенным уведомлением
       • Real-time многопользовательские игры (flash, websocket)
       • Чаты. IM-гейты
       • Сервер flashpolicy
   – Фронтенд-сервер. Comet-server. Оповещение о событиях.

• Синхронные сервисы
   – Бэкенды. Обработчики. Кэш-сервер со сложной логикой
Отличия libevent от select
libevent - библиотеки асинхронного неблокирующего ввода/вывода


• Работает с механизмами 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

               DB         Memcache




 php-backend        php-backend       php-backend



                    Frontend


client     client      client     client    client
Несколько
frontend-серверов
Несколько фронтенд-серверов

                            DB         Memcache




backend      backend        backend        backend      backend        backend


            Frontend                                   Frontend


client    client   client     client      client     client   client     client
Comet-сервер


     php            php



           nginx                      comet




client     client   client   client
Проблема приложений с быстрым откликом

                            SERVER
           xy          xy                       xy
                                                xy
           xy          xy                       xy

           xy          xy

           xy          xy
                                                xy
           xy          xy                       xy


            CLIENT-1                 CLIENT-2
Проблема приложений с быстрым откликом
        Посылаем периодически пустые пакеты

                             SERVER
            xy          xy            …          xy

            xy          xy            …          xy

            xy          xy            …          xy

            xy          xy            …          xy

            xy          xy            …          xy


             CLIENT-1                     CLIENT-2
Особенности 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        •   $a==const
•   if else           •   switch
•   function     VS   •   class::method
•   $a                •   $longVariable
Чистка мусора
Чистка мусора
• Закрываем дескрипторы
• Явно чистим замкнутые ссылки
• unset()
PHP-демоны
• В php имеются полноценные средства для создания асинхронных
  сервисов с неблокирующими сокетами
• Сервисы с несложной логикой работают не намного хуже
  демонов на Cи
• Простота и скорость разработки
Вопросы

Глазков Денис
PHP-разработчик компании badoo

Email/jabber: denis@corp.badoo.com

Демоны на PHP (Денис Глазков)