SlideShare a Scribd company logo
Пора ли отправлять С на свалку истории?  Пишем демонов на PHP с использованием расширения libevent
Кто мы такие? Вадим Крючков [Long], руководитель группы разработки Андрей Голубев [440hz], ведущий разработчик Евгений Прудников, ведущий разработчик
Обычная архитектура (mem)cached
Наша архитектура — включаем демоны
Демонизация. Что есть такое  libevent? Предоставляет простой механизм для запуска callback функций, при наступлении определенного события на дескрипторе: READ WRITE TIMEOUT SIGNAL http://www.monkey.org/~provos/libevent/ http://ru.php.net/manual/en/intro.libevent.php
Пишем демона
Пишем демона, работающего с сокетом // Создаем сокет - event вешается на дескриптор $rSocket  = stream_socket_server (  'tcp://127.0.0.1:666' ,  $errno ,  $errstr ,  STREAM_SERVER_BIND | STREAM_SERVER_LISTEN ); // далем его не блокирующим, что бы позволить принимать другие коннекты stream_set_blocking (  $rSocket ,  0  );
Пишем демона — подключаем libevent // создаем событийную базу $rBaseEvent  = event_base_new ( ); // создаем новое событие для сокета $rSocketEvent  = event_new ( ); /** * ловим события "чтение" и после операции чтения возвращаем событие в базу * EV_READ - чтение * EV_PERSIST - вернуть событие в базу после выполнения */ event_set (  $rSocketEvent ,  $rSocket , EV_READ | EV_PERSIST,  'onAcceptEvent'  ); // устанавливаем событие в базу событий event_base_set (  $rSocketEvent ,  $rBaseEvent  ); // запускаем отслеживание event_add (  $rSocketEvent  ); // запускаем цикл event_base_loop (  $rBaseEvent  );
Метод обработки function  onAcceptEvent (  $rSocket ,  $rEvent ,  $args  ) { global  $rBaseEvent ;  // удобнее сделать через объект ;) static  $iConnect  =  0 ;  // идентификатор конекта $iConnect ++; // Примем коннект $rConnection  = stream_socket_accept (  $rSocket  ); // далем коннект не блокирующим, что бы позволить принимать еще коннекты stream_set_blocking (  $rConnection ,  0  ); // создадим буфер обмена данными $buf  = event_buffer_new (  $iConnect ,  'onReadEvent' ,  'onWriteEvent' ,  'onFailureEvent' ,  $iConnect ); // подключаем буфер к базе событий event_buffer_base_set (  $buf ,  $rBaseEvent  ); // включаем буфер на события и возвращаем события назад после выполнения event_buffer_enable (  $buf , EV_READ | EV_WRITE | EV_PERSIST ); }
Метод чтения $iBufferReadLenght  =  1024 ;  // размер буфера чтения function  onReadEvent( $rStream ,  $args ) { global  $iBufferReadLenght ; $tmp  =  '' ; do  { $tmp  .= event_buffer_read (  $hBuffer ,  $this ->iBufferReadLenght ); if (  $iBufferReadLenght  > strlen( $tmp ) ) { break ; } }  while  (  true  ); return  $tmp ; }
Превращаем демона в ... или не документированные возможности
Таймеры (thnx 440hz) Стандартный таймер libevent'а не работает :( Выход есть! событие можно повесить на «любой» дескриптор event_add  (  resource $event,  int  $timeout  )
Таймеры - решение tmpfile() - открываем новый временный файл «вешаем» на этот дескриптор отложенное событие event_set( $rTimers , $rTtmpFile , 0 , 'onTimer' , ) ;
Демонстрация http://cyberdot.ru/src/socket.phps
Подводные камни Очень мало информации и примеров Следить за ресурсами, не забываем их освобождать Хитрости при чтении данных, превышающих размер буфера Входных данных — много и они бывают «чужие» :) Проблемы с отслеживанием сигналов (EV_SIGNAL)
Даем нагрузку
Тестирование ботами Имитируем … пользователей в on-line: Воспользовались API Написали приложение, генерирующее ботов
Результаты Сервер Xeon 8х2.66GHz, RAM 8Gb: Около 2.5 тысяч запросов в секунду (не Hello, World) На 1 пользователя в online расходуется около 1Мб памяти  Приложение (пока) не подвергалось жесткой оптимизации
Результаты Сервер Xeon 8х2.66GHz, RAM 8Gb: Около 2.5 тысяч запросов в секунду (не Hello, World) На 1 пользователя в online расходуется около 1Мб памяти  Приложение (пока) не подвергалось жесткой оптимизации Память не «течет» (1 месяц публичного бета-теста не выявили)
Советы Научитесь «мыслить параллельно» Процесс не завершается Чужие данные Читайте исходники —  в них много полезного Если демон будет не один —  напишите простенький фреймворк Документируйте код  +  протокол взаимодействия Напишите хороший логгер  - без него отлаживать приложение будет сложно Сделайте несколько уровней логгирования
Выводы Выводы пока делать рано :)
Выводы (серьезно) Можно рекомендовать к использованию на продакшене Позволяет держать хорошие нагрузки (при этом оставляя LA в разумных пределах ) Реальные тесты — придется подождать :(
Вопросы?
Ad

More Related Content

What's hot (20)

Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
Positive Hack Days
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
RAMBLER&Co
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
guest32215a
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
Positive Hack Days
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
ygoltsev
 
Пожиратели памяти в WordPress
Пожиратели памяти в WordPressПожиратели памяти в WordPress
Пожиратели памяти в WordPress
Konstantin Kovshenin
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
Moscow.pm
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
RAMBLER&Co
 
Филипп Ковалев — Путь в npm
Филипп Ковалев — Путь в npmФилипп Ковалев — Путь в npm
Филипп Ковалев — Путь в npm
Yandex
 
PowerShell
PowerShellPowerShell
PowerShell
GetDev.NET
 
Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎
mayperl
 
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
Ontico
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
Yandex
 
ProcessingとMaxMSPの連携
ProcessingとMaxMSPの連携ProcessingとMaxMSPの連携
ProcessingとMaxMSPの連携
Aki Sato
 
Fabric для управления серверами
Fabric для управления серверамиFabric для управления серверами
Fabric для управления серверами
Maxim Kulsha
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
Anthony Shoumikhin
 
10 ns error
10   ns error10   ns error
10 ns error
Noveo
 
05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы
Roman Brovko
 
«Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep
«Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep
«Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep
e-Legion
 
Применяем Ansible
Применяем AnsibleПрименяем Ansible
Применяем Ansible
Alexander Svetkin
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
Positive Hack Days
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
RAMBLER&Co
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
guest32215a
 
Юрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWWЮрий Гольцев - Сервис PLWWW
Юрий Гольцев - Сервис PLWWW
Positive Hack Days
 
plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)plwww (24.03) MEPHI (PHDays)
plwww (24.03) MEPHI (PHDays)
ygoltsev
 
Пожиратели памяти в WordPress
Пожиратели памяти в WordPressПожиратели памяти в WordPress
Пожиратели памяти в WordPress
Konstantin Kovshenin
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
Moscow.pm
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
RAMBLER&Co
 
Филипп Ковалев — Путь в npm
Филипп Ковалев — Путь в npmФилипп Ковалев — Путь в npm
Филипп Ковалев — Путь в npm
Yandex
 
Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎Работа с большими файлами под перлом‎
Работа с большими файлами под перлом‎
mayperl
 
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
Приёмы разработки высоконагруженных приложений на Twisted (Андрей Смирнов)
Ontico
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
Yandex
 
ProcessingとMaxMSPの連携
ProcessingとMaxMSPの連携ProcessingとMaxMSPの連携
ProcessingとMaxMSPの連携
Aki Sato
 
Fabric для управления серверами
Fabric для управления серверамиFabric для управления серверами
Fabric для управления серверами
Maxim Kulsha
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
Anthony Shoumikhin
 
10 ns error
10   ns error10   ns error
10 ns error
Noveo
 
05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы
Roman Brovko
 
«Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep
«Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep «Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep
«Отладка приложений с помощью dtrace» — Станислав Краснояров, Redsteep
e-Legion
 

Viewers also liked (20)

Pavilion Photo Page 1
Pavilion Photo Page 1Pavilion Photo Page 1
Pavilion Photo Page 1
bananasfunpark
 
Meet Eat & Play
Meet Eat & PlayMeet Eat & Play
Meet Eat & Play
bananasfunpark
 
Htel Serviced Apartments, Informatief
Htel Serviced Apartments, InformatiefHtel Serviced Apartments, Informatief
Htel Serviced Apartments, Informatief
guest8b8230
 
Awi cmip peru_nomv
Awi cmip peru_nomvAwi cmip peru_nomv
Awi cmip peru_nomv
Renny Daniel Diaz Aguilar
 
Turning the IT Dept. Outward
Turning the IT Dept. OutwardTurning the IT Dept. Outward
Turning the IT Dept. Outward
Bohyun Kim
 
Leveraging You: Developing an Online Presence for the Job Search and Beyond
Leveraging You: Developing an Online Presence for the Job Search and BeyondLeveraging You: Developing an Online Presence for the Job Search and Beyond
Leveraging You: Developing an Online Presence for the Job Search and Beyond
Bohyun Kim
 
Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.
Vadim Kruchkov
 
Quick & Easy Data Visualization with Google Visualization API + Google Char...
Quick & Easy Data Visualization with Google Visualization API + Google Char...Quick & Easy Data Visualization with Google Visualization API + Google Char...
Quick & Easy Data Visualization with Google Visualization API + Google Char...
Bohyun Kim
 
The Mobile Web and the Mobile Websites of Libraries: How They Changed for the...
The Mobile Web and the Mobile Websites of Libraries: How They Changed for the...The Mobile Web and the Mobile Websites of Libraries: How They Changed for the...
The Mobile Web and the Mobile Websites of Libraries: How They Changed for the...
Bohyun Kim
 
Jerks At Work - Task 2997
Jerks At Work - Task 2997Jerks At Work - Task 2997
Jerks At Work - Task 2997
guest0d9001c
 
Jerks At Work - Task 2997
Jerks At Work - Task 2997Jerks At Work - Task 2997
Jerks At Work - Task 2997
guest0d9001c
 
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформу
Vadim Kruchkov
 
Avatars In The Working Environment
Avatars In The Working EnvironmentAvatars In The Working Environment
Avatars In The Working Environment
guest0d9001c
 
How To Manage A Difficult Conversation At Work - Task 3812
How To Manage A Difficult Conversation At Work - Task 3812How To Manage A Difficult Conversation At Work - Task 3812
How To Manage A Difficult Conversation At Work - Task 3812
guest0d9001c
 
Excel avanzado primera parte
Excel avanzado primera parteExcel avanzado primera parte
Excel avanzado primera parte
Everth Sanabria
 
Imagens do jogo PES 2011
Imagens do jogo PES 2011Imagens do jogo PES 2011
Imagens do jogo PES 2011
Luansobreira
 
Hash mitad al cuadrado pdf
Hash mitad al cuadrado pdfHash mitad al cuadrado pdf
Hash mitad al cuadrado pdf
Sebastian Morales
 
Presentación1
Presentación1Presentación1
Presentación1
Jorge Astorga Macedo
 
Corrida de Toiros
Corrida de ToirosCorrida de Toiros
Corrida de Toiros
Kateryna Ferreira
 
Autoestima
AutoestimaAutoestima
Autoestima
Carolina Tavares
 
Htel Serviced Apartments, Informatief
Htel Serviced Apartments, InformatiefHtel Serviced Apartments, Informatief
Htel Serviced Apartments, Informatief
guest8b8230
 
Turning the IT Dept. Outward
Turning the IT Dept. OutwardTurning the IT Dept. Outward
Turning the IT Dept. Outward
Bohyun Kim
 
Leveraging You: Developing an Online Presence for the Job Search and Beyond
Leveraging You: Developing an Online Presence for the Job Search and BeyondLeveraging You: Developing an Online Presence for the Job Search and Beyond
Leveraging You: Developing an Online Presence for the Job Search and Beyond
Bohyun Kim
 
Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.Работа с унаследованным кодом. Есть ли жизнь после коммита.
Работа с унаследованным кодом. Есть ли жизнь после коммита.
Vadim Kruchkov
 
Quick & Easy Data Visualization with Google Visualization API + Google Char...
Quick & Easy Data Visualization with Google Visualization API + Google Char...Quick & Easy Data Visualization with Google Visualization API + Google Char...
Quick & Easy Data Visualization with Google Visualization API + Google Char...
Bohyun Kim
 
The Mobile Web and the Mobile Websites of Libraries: How They Changed for the...
The Mobile Web and the Mobile Websites of Libraries: How They Changed for the...The Mobile Web and the Mobile Websites of Libraries: How They Changed for the...
The Mobile Web and the Mobile Websites of Libraries: How They Changed for the...
Bohyun Kim
 
Jerks At Work - Task 2997
Jerks At Work - Task 2997Jerks At Work - Task 2997
Jerks At Work - Task 2997
guest0d9001c
 
Jerks At Work - Task 2997
Jerks At Work - Task 2997Jerks At Work - Task 2997
Jerks At Work - Task 2997
guest0d9001c
 
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформу
Vadim Kruchkov
 
Avatars In The Working Environment
Avatars In The Working EnvironmentAvatars In The Working Environment
Avatars In The Working Environment
guest0d9001c
 
How To Manage A Difficult Conversation At Work - Task 3812
How To Manage A Difficult Conversation At Work - Task 3812How To Manage A Difficult Conversation At Work - Task 3812
How To Manage A Difficult Conversation At Work - Task 3812
guest0d9001c
 
Excel avanzado primera parte
Excel avanzado primera parteExcel avanzado primera parte
Excel avanzado primera parte
Everth Sanabria
 
Imagens do jogo PES 2011
Imagens do jogo PES 2011Imagens do jogo PES 2011
Imagens do jogo PES 2011
Luansobreira
 
Ad

Similar to Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием расширения libevent (20)

Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
Yandex
 
Введение в Docker
Введение в DockerВведение в Docker
Введение в Docker
Кузьмицкий Александр
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur Shemsedinov
 
Пост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновениеПост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновение
beched
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
phpdevby
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappers
Positive Hack Days
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)
Alexey Kachayev
 
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ontico
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
beshkenadze
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Kirill Chebunin
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf Conference
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
Roman Dvornov
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
megakott
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
Positive Hack Days
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
Technopark
 
Silverlight 4, есть ли жизнь на десктопе
Silverlight 4, есть ли жизнь на десктопеSilverlight 4, есть ли жизнь на десктопе
Silverlight 4, есть ли жизнь на десктопе
Alex Tumanoff
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
Yandex
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur Shemsedinov
 
Пост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновениеПост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновение
beched
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
phpdevby
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappers
Positive Hack Days
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)
Alexey Kachayev
 
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ontico
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
beshkenadze
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Kirill Chebunin
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf Conference
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
Roman Dvornov
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
megakott
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
Positive Hack Days
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
Technopark
 
Silverlight 4, есть ли жизнь на десктопе
Silverlight 4, есть ли жизнь на десктопеSilverlight 4, есть ли жизнь на десктопе
Silverlight 4, есть ли жизнь на десктопе
Alex Tumanoff
 
Ad

Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием расширения libevent

  • 1. Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием расширения libevent
  • 2. Кто мы такие? Вадим Крючков [Long], руководитель группы разработки Андрей Голубев [440hz], ведущий разработчик Евгений Прудников, ведущий разработчик
  • 4. Наша архитектура — включаем демоны
  • 5. Демонизация. Что есть такое libevent? Предоставляет простой механизм для запуска callback функций, при наступлении определенного события на дескрипторе: READ WRITE TIMEOUT SIGNAL http://www.monkey.org/~provos/libevent/ http://ru.php.net/manual/en/intro.libevent.php
  • 7. Пишем демона, работающего с сокетом // Создаем сокет - event вешается на дескриптор $rSocket = stream_socket_server ( 'tcp://127.0.0.1:666' , $errno , $errstr , STREAM_SERVER_BIND | STREAM_SERVER_LISTEN ); // далем его не блокирующим, что бы позволить принимать другие коннекты stream_set_blocking ( $rSocket , 0 );
  • 8. Пишем демона — подключаем libevent // создаем событийную базу $rBaseEvent = event_base_new ( ); // создаем новое событие для сокета $rSocketEvent = event_new ( ); /** * ловим события "чтение" и после операции чтения возвращаем событие в базу * EV_READ - чтение * EV_PERSIST - вернуть событие в базу после выполнения */ event_set ( $rSocketEvent , $rSocket , EV_READ | EV_PERSIST, 'onAcceptEvent' ); // устанавливаем событие в базу событий event_base_set ( $rSocketEvent , $rBaseEvent ); // запускаем отслеживание event_add ( $rSocketEvent ); // запускаем цикл event_base_loop ( $rBaseEvent );
  • 9. Метод обработки function onAcceptEvent ( $rSocket , $rEvent , $args ) { global $rBaseEvent ; // удобнее сделать через объект ;) static $iConnect = 0 ; // идентификатор конекта $iConnect ++; // Примем коннект $rConnection = stream_socket_accept ( $rSocket ); // далем коннект не блокирующим, что бы позволить принимать еще коннекты stream_set_blocking ( $rConnection , 0 ); // создадим буфер обмена данными $buf = event_buffer_new ( $iConnect , 'onReadEvent' , 'onWriteEvent' , 'onFailureEvent' , $iConnect ); // подключаем буфер к базе событий event_buffer_base_set ( $buf , $rBaseEvent ); // включаем буфер на события и возвращаем события назад после выполнения event_buffer_enable ( $buf , EV_READ | EV_WRITE | EV_PERSIST ); }
  • 10. Метод чтения $iBufferReadLenght = 1024 ; // размер буфера чтения function onReadEvent( $rStream , $args ) { global $iBufferReadLenght ; $tmp = '' ; do { $tmp .= event_buffer_read ( $hBuffer , $this ->iBufferReadLenght ); if ( $iBufferReadLenght > strlen( $tmp ) ) { break ; } } while ( true ); return $tmp ; }
  • 11. Превращаем демона в ... или не документированные возможности
  • 12. Таймеры (thnx 440hz) Стандартный таймер libevent'а не работает :( Выход есть! событие можно повесить на «любой» дескриптор event_add ( resource $event, int $timeout )
  • 13. Таймеры - решение tmpfile() - открываем новый временный файл «вешаем» на этот дескриптор отложенное событие event_set( $rTimers , $rTtmpFile , 0 , 'onTimer' , ) ;
  • 15. Подводные камни Очень мало информации и примеров Следить за ресурсами, не забываем их освобождать Хитрости при чтении данных, превышающих размер буфера Входных данных — много и они бывают «чужие» :) Проблемы с отслеживанием сигналов (EV_SIGNAL)
  • 17. Тестирование ботами Имитируем … пользователей в on-line: Воспользовались API Написали приложение, генерирующее ботов
  • 18. Результаты Сервер Xeon 8х2.66GHz, RAM 8Gb: Около 2.5 тысяч запросов в секунду (не Hello, World) На 1 пользователя в online расходуется около 1Мб памяти Приложение (пока) не подвергалось жесткой оптимизации
  • 19. Результаты Сервер Xeon 8х2.66GHz, RAM 8Gb: Около 2.5 тысяч запросов в секунду (не Hello, World) На 1 пользователя в online расходуется около 1Мб памяти Приложение (пока) не подвергалось жесткой оптимизации Память не «течет» (1 месяц публичного бета-теста не выявили)
  • 20. Советы Научитесь «мыслить параллельно» Процесс не завершается Чужие данные Читайте исходники — в них много полезного Если демон будет не один — напишите простенький фреймворк Документируйте код + протокол взаимодействия Напишите хороший логгер - без него отлаживать приложение будет сложно Сделайте несколько уровней логгирования
  • 21. Выводы Выводы пока делать рано :)
  • 22. Выводы (серьезно) Можно рекомендовать к использованию на продакшене Позволяет держать хорошие нагрузки (при этом оставляя LA в разумных пределах ) Реальные тесты — придется подождать :(