SlideShare uma empresa Scribd logo
1 de 69
Воюем за ресурсы:
повышение производительности ZF
         приложения с
помощью phpDaemon + Varnish + ESI
Алексей Качаев
Senior/Lead PHP Developer at
Cogniance

4+ года опыта c PHP

3+ года использования Zend
Framework

Активный участник
zendframework.ru/forum

ZF2 contributor
О чем мы будем говорить

• о ресурсах и о том, почему их не хватает
• о времени и о том, куда оно девается
• о пользователях, современных веб-приложениях и о
  проблемах, с ними связанными
• ...
Как мы будем говорить
1. 2 проблемы в использовании ресурсов на реальных
примерах из широкой практики

2. как эти пробемы можно решить быстро и практически
безболезнено (как в новом, так и в функционирующем
проекте)

3. контректный zf app и все шаги имплементации того, что
описано в п. 2




  Понимание проблем и путей их решения важно
СХЕМЫ БОЕВЫХ
  ДЕЙСТВИЙ
Проблема 1. Запросы и
инициализация
        Пользователь -> Запрос к серверу

                         =

     nginx + apache2 + php + Zend + application
apache2 + mod_php + Zend
Проблема 1. Запросы и
инициализация
   AJAX + Пользователь => Много запросов к серверу

                             =

    (nginx + apache2 + php + Zend + application) * много



Примеры: autosuggest-поле, валидация формы, загрузка
виджетов и т.д.
apache2 + mod_php + Zend + AJAX
Проблема 1. Запросы и
инициализация
            Rich application = AJAX * много

                           =

 (nginx + apache2 + php + Zend + application) * много (в
                      квадрате)
Куда уходит время

- создание объекта приложения
- чтение и сборка конфигурации (тут даже кеш не спасает)
- загрузка и инициализация ресурсов

Затраты: до 40-60% времени выполнения.
Как хотелось бы? (псевдо код)

Framework::initialize();

while($request = Somewhere::request()) {
  // Тут мы что-то делаем
  // Отдаем ответ
}

Framework::shutdown();
Особенности PHP реализации

1. Проблемы:

  - корявая реализация поддержки Fast-CGI на PHP

2. Существующие решения:

  - php-fpm (FastCGI Process Manager, http://php-fpm.org/)

  - phpDaemon
phpDaemon в студии

Основные возможности

- WebSocket, HTTP, FastCGI, flash
- асинхронные клиенты для MySQL, Memcache, MongoDB и
других
- динамическая перегрузка кода в демон при изменении
файлов
- статистика по количеству запросам, памяти и т.д.
- гибкая настройка worker'ов
...
- многое другое
Схема того, как будет работать с
phpDaemon
Проблема 2. Кеширование HTML

1. Это заманчиво!

- обслуживание большого количества подключений
одновременно
- возможность не инициализировать приложение вообще

2. Это проблематично!

- "размазывание кеша" (для авторизированных
пользователей, по cookies и т.д.)
- точечная инвалидация = "микро-инфаркт" (например,
блок последних комментариев на хабре)
"Размазывание кеша"
"Микро-кеш-инфаркт"
Проблема 2. Возьмем хитростью

1. Varnish, как промежуточный кеширующий сервер
(caching HTTP reverse proxy)
http://www.varnish-cache.org/

2. ESI, как markup language связи логических кусков HTML
http://en.wikipedia.org/wiki/Edge_Side_Includes

<esi:include src="..." onerror="continue"/>

3. Nginx, как front web server
http://nginx.org/
Проблема 2. Расплата за хитрость


ESI = Увеличение количества запросов к backend

Большинство из этих запросов однотипно и нетребует
мощностей всего приложения



            ВЕРНУЛИСЬ К ПРОБЛЕМЕ 1

                         Слава богу, мы уже знаем как ее
                                                решать.
ОБЩАЯ СХЕМА РАБОТЫ С
   КЕШ-СЕРВЕРОМ И
     ДЕМОНАМИ
Общая схема



                Прокси
  Статика
               на daemon
                           Запросы на backend-ы

            Кеширование
ОПИСАНИЕ DEMO
 APPLICATION
Демо приложение: "Конференция"

1. Список докладов из базы данных

2. Добавление докладов в избранное без регистрации

3. Форма поиска по докладам с "подсказыванием" тегов

4. ~ Вход/выход для зарегистрированных пользователей


Sources
https://github.com/kachayev/zfconf-speech
Демо приложение: "Конференция"
Демо приложение: "Конференция"
ВНЕДРЕНИЕ
PHPDAEMON
phpDaemon: установка

1. Официальная документация

https://github.com/kakserpom/phpdaemon/wiki/Installation-
(common)

2. Используется PECL расширения libevent, proctitle
(возможно потребуется пересборка PHP из исходников)

http://tokarchuk.ru/2010/09/%D1%83%D1%81%D1%82%D0%
B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-
phpdaemon-libevent-%D0%BD%D0%B0-ubuntu/


         РУКОВОДСТВА БЫСТРО УСТАРЕВАЮТ
phpDaemon: установка на Ubuntu
0. Нам понадобиться: php-dev, build-essential, git

1. Удаляем старую libevent1

2. Скачиваем новую из ветки 1.4 (2я пока в альфе). Далее
наше любимое .configure && make && make install

3. Устанавливаем pecl extension libevent-0.0.4, добавляем
его подгрузку в /etc/php5/cli/php.ini

4. Аналочиные действия с proctitle

5. Устанавливаем phpDaemon... ->
phpDaemon: установка на Ubuntu
cd /usr/local/lib
git clone git://github.com/kakserpom/phpdaemon.git $path

cd ./phpdaemon
chmod +x ./bin/phpdaemon

ln /usr/bin/phpdaemon /usr/local/lib/phpdaemon/bin/phpdaemon

cp init-scripts/phpd /etc/init.d/
mkdir /etc/phpd/ && cp conf/phpd.conf.example /etc/phpd/phpd.conf

/usr/local/lib/phpdaemon/bin/phpdaemon start




В файл конфигурации добавляем следующее:
HTTP {
enable 1;
    listen 127.0.0.1;
  listen-port 8020;
responder "Example"
}
phpDaemon:
default application
1. Принимает HTTP
запросы на порт, без     р
веб-сервера

2. Siege показал 370
обработанных реквестов
в секунду при 100
одновременных
подключениях.
Прикручиваем к своему проекту
1. Выделяем консистентные блоки (autocomplete,
autosuggest, рендеринг отдельных блоков, виджеты и т.д.)

Важно! Операция на демоне должна затрагивать минимум
различных частей приложения. Подходят: ajax-проверка
полей формы, inline-редактирование данных,
autosuggest/complete и т.д.

2. Отделяем выполнение (Ajax, SSI, ESI etc).

3. Поднимаем демон, реализованный как HTTP App (при
желании можно и Fast CGI).
(следующий слайд)
Прикручиваем к своему проекту
(прд.)
Начинаем с Nginx-подобного конфиг-файла.

/etc/phpd/phpd.conf




                              Примечание:

      (Можно через AppResolver.php, но для
              простых случаев это overkill)
phpDaemon + Zend Framework

Responder application - класс, наследник AppInstance
Должен реализовать следующие функции:

init() - инициализация фреймворка (создаем Zend
Application, бутстрапимся, получаем Front Controller)

beginRequest() - вызывается, когда приложение получает
новый Request для обработки (возвращаем специальный
объект - наследник HTTPRequest)

onReady() - вызывается после отработки инициализации
onShutdown() - завершаем работу фрейморка
phpDaemon + ZF (окружение)

/usr/local/phpdaemon/applications/ZfconfApp.php
phpDaemon + ZF (app instance)
phpDaemon -> Request

HTTPRequest содержит все нужные нам данные GET,
POST, COOKIES, SESSION и т.д.

В наследнике должны реализовать функции

run() - передать в приложение новые суперглобальные,
подготовить Response, должны вернуть Request::DONE
(сбрасываем Request, Response объекты Front Controller'а и
выполняем run())

onFinish() - возвращаем подготовленный ранее Response
phpDaemon -> Request
Nginx -> phpDaemon

4. Nginx "ловит" адрес и перенаправляет его на backend
(HTTP, или FastCGI)

Полный разбор nginx кофигурации не делаем.
Только момент "перехвата" URL.
Несколько замечаний (номер 1)

Важно! При реализации данного подхода критически
важно, чтобы инициализация (Bootstrap, Application
Resources) не делала ничего request-зависимого.

Например.

Присваивание текущего языка (current language) в Bootstrap
- это очень большая ошибка. Для этого есть плагины.

(вспоминаем цикл диспечирезации).
Несколько замечаний (номер 2)

Важно! Внимательно следите, чтобы никто "не посмел"
отправить клиенту хоть какие-то данные, до тех пор, пока
это явно не сделает phpDaemon.

Например.

В коде Action'а:
$this->_helper->json($data);

Приведет к:
(примеров много)
Что получилось?

Autosuggest отдается демоном.
Known issues

1. Debian, Ubuntu - проблемы с рестартом при "зависших"
подключениях (аналогично Mongo). "Спасает":




2. Если работа ведется без веб-сервера, то нужно помнить
о статике. Например, попытка обработать запрос
/favicon.ico с помощью Zend отправляет phpDaemon в
глубокий down.

Т.е. без веб-сервера фильтруем статику в ручную.
Что дальше?

Неблокирующий MySQL драйвер
Неблокирующий Memcache клиент
И т.д.

Как это работает? (на примере MySQL)

1. Запрос (обработчик) делает request на MySQL и вешает
callback

2. Вызывается $this->sleep(30) - диспечер выбрасывает
процесс из обработки, чтобы вернуться через 30 сек

3. В callback делается $this->wakeup()
Что дальше?

В последних версиях появилась возможность использовать

Sandbox

Fatal error воркера не приводит к перезапуску демона.
Оценим полученный результат

+ Плюсы

1. Снижение нагрузки на сервер и потребляемых ресурсов
2. Уменьшение времени ожидания ответа

- Минусы

1. Усложнение деплоя
2. Усложнение тестирования
3. Усложнение управления приложением
Полезные материалы по теме

0. "Офф. сайт"
http://phpdaemon.net/

1. phpDaemon - фреймворк асинхронных приложений
http://habrahabr.ru/blogs/php/79377/

2. Wiki документация
https://github.com/kakserpom/phpdaemon/wiki
ВНЕДРЕНИЕ
 VARNISH
Varnish: сильные стороны

1. Мощный язык конфигурации VCL (Varnish Configuration
Language)

2. Легкость горизонтального масштабирования

3. Возможность использования механизмов балансировки
нагрзуки с учетом времени ответов и загруженности бекенд
серверов

4. Поддержка ESI разметки

5. Большое количество отличных утилит для
профайлирования и мониторинга
Varnish Administration Console
Varhish: установка на Ubuntu
cd /tmp
sudo bash

curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -
echo "deb http://repo.varnish-cache.org/ubuntu/ $(lsb_release -s -c) varnish-2.1" >> /etc/apt/source.list

apt-get update && apt-get install varnish

# Далее вы можете использовать init-скрипт
* Usage: /etc/init.d/varnish {start|stop|restart|force-reload}




Установка на других платформах:
http://www.varnish-cache.org/docs

Установка web-based admin console:
http://www.varnish-cache.org/trac/wiki/WebGui
Конфигурация демона

/etc/default/varnish для Ubuntu
- необходимость запуска демона START=yes
- порт, который будет слушать демон (:81)
VCL файл

/etc/varnish/varnish.vcl
- описание backend
VCL файл
/etc/varnish/varnish.vcl
- описание процедур hash, fetch, deliver, hit, recv
VCL файл
/etc/varnish/varnish.vcl
- описание процедур hash, fetch, deliver, hit, recv
VCL файл
VCL файл
/etc/varnish/varnish.vcl
- описание процедур hash, fetch, deliver, hit, recv
Nginx location resolving
PhpDaemon workers

В указанном выше примере использовался один и тот же
ZfconfApp на порту 8091.

Но, часто есть смысл разграничивать обработчики:
- отдельный worker на autosuggest
- отдельный worker на рендеринг AJAX-видета

В таких случаях используется AppResolver.php (можно
прописывать правила "раздачи" запросов на worker-ы).
Использование ESI

Основное

- Формат: <esi:include src="" />
- Директивы alt и onerror на данный момент не
поддерживаются
- для Zend-a самописный View Helper (рендер include и
отправление заголовка esi-enabled)
Использование ESI

Обратить внимание

- отключаем сжатие (nginx: gzip off, apache2: no deflate)

- проблемы с ETag, If-Non-Match

- отслеживание поведения кеша по URL (nginx rewrite,
apache2 rewrite, Zend routing, URL-mark etc)

- готовьтесь к сюрпризам :)
А можно ли по другому?

По аналогу со схемой Nginx + Varnish + ESI можно
использовать схему

Nginx + SSI + Memcache

Минусы

- nginx не умеет писать контент в memcache (нужно писать
со стороны backend-a)
- слабые возможности конфигурирования кеш-ключа
- сложно управлять кешированием
Подводные камни

1. Правильность разграничения контента

Например, если HTML различается по языку, хранящемуся в cookies, то
это нужно учитывать.
Подводные камни

2. Очистка выполняется через CLI или отправкой запроса
HTTP PURGE

Не самая простая процедура, поэтому для dev-режима нужно
предусмотреть возможность работы с TTL=0.

Очистка varnish-кеша по объекто-зависимым событиям.
Пример: очистить кеш списка докладов после внесения
изменений пользователем.

- переопределить CacheManager
- обернуть необходимые cache backend в специальные
враппер
Подводные камни




Конкретная реализация зависит от общей схемы работы
с кешем
Подводные камни

3. Управление кешем со стороны клиента (Cache-Control,
etc)
В demo app есть пример работы заголовками клиента



4. Документация во многом не соответствует правде.
Нагрузочное тестирование
результата
Не очень информативно и предсказуемо, но по факту:
ab -n 100 -c 5 http://zfconf.loc/




Преимущество: response time практически не
увеличивается при повышении concurrency level.
Ссылки на полезные материалы

Varnish docs and tutorials:
• http://www.varnish-cache.org/docs/2.1/index.html
• http://www.ibm.com/developerworks/opensource/library/os-php-
  varnish/?ca=dgr-lnxw06Varnish-PHP
• http://www.mediawiki.org/wiki/Manual:Varnish_caching

ESI:
• http://www.varnish-cache.org/trac/wiki/ESIfeatures
• http://cd34.com/blog/infrastructure/no-esi-processing-first-char-not/

VCL:
• http://www.varnish-cache.org/docs/2.1/tutorial/vcl.html
Спасибо за внимание!



            Вопросы
              ???

Mais conteúdo relacionado

Mais procurados

Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
Fwdays
 
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
DneprCiklumEvents
 
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай КондратовБыстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Fuenteovejuna
 
Maven как средство сборки проекта
Maven как средство сборки проектаMaven как средство сборки проекта
Maven как средство сборки проекта
Yova Stoika
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
Technopark
 
Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)
Ontico
 
Алексей Лапаев - Протоколы межкомпонентного взаимодействия
Алексей Лапаев - Протоколы межкомпонентного взаимодействияАлексей Лапаев - Протоколы межкомпонентного взаимодействия
Алексей Лапаев - Протоколы межкомпонентного взаимодействия
Yandex
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
Fuenteovejuna
 

Mais procurados (19)

The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NET
 
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
 
Perl Debugger и mod_perl
Perl Debugger и mod_perlPerl Debugger и mod_perl
Perl Debugger и mod_perl
 
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
 
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай КондратовБыстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
 
Maven как средство сборки проекта
Maven как средство сборки проектаMaven как средство сборки проекта
Maven как средство сборки проекта
 
Web deployment
Web deploymentWeb deployment
Web deployment
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
 
Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)
 
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
ТОП ошибок в инфраструктуре, мешающих высоким нагрузкам / Андрей Половов (Флант)
 
Алексей Лапаев - Протоколы межкомпонентного взаимодействия
Алексей Лапаев - Протоколы межкомпонентного взаимодействияАлексей Лапаев - Протоколы межкомпонентного взаимодействия
Алексей Лапаев - Протоколы межкомпонентного взаимодействия
 
Фронтенд разработка без боли
Фронтенд разработка без болиФронтенд разработка без боли
Фронтенд разработка без боли
 
Phalcon. Что нового?
Phalcon. Что нового?Phalcon. Что нового?
Phalcon. Что нового?
 
Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?Silverlight 4, есть ли жизнь на десктопе?
Silverlight 4, есть ли жизнь на десктопе?
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 

Destaque

ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf Conference
 
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf Conference
 
Doing Business With Aboriginal People
Doing Business With Aboriginal PeopleDoing Business With Aboriginal People
Doing Business With Aboriginal People
Lee_Ahenakew
 
Representative Projects
Representative ProjectsRepresentative Projects
Representative Projects
laurameyer
 
Acta ci 28 09-2012 logo
Acta ci 28 09-2012 logoActa ci 28 09-2012 logo
Acta ci 28 09-2012 logo
oscargaliza
 

Destaque (20)

ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
 
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)
 
Doing Business With Aboriginal People
Doing Business With Aboriginal PeopleDoing Business With Aboriginal People
Doing Business With Aboriginal People
 
LD_March2010_forweb
LD_March2010_forwebLD_March2010_forweb
LD_March2010_forweb
 
การแบ่งภูมิภาคทวีปยุโรป2.1
การแบ่งภูมิภาคทวีปยุโรป2.1การแบ่งภูมิภาคทวีปยุโรป2.1
การแบ่งภูมิภาคทวีปยุโรป2.1
 
Adverts
AdvertsAdverts
Adverts
 
Малобюджетный маркетинг
Малобюджетный маркетингМалобюджетный маркетинг
Малобюджетный маркетинг
 
pitch
pitchpitch
pitch
 
acoooooo
acooooooacoooooo
acoooooo
 
JudCon Brazil 2014 - Mobile push for all platforms
JudCon Brazil 2014 - Mobile push for all platformsJudCon Brazil 2014 - Mobile push for all platforms
JudCon Brazil 2014 - Mobile push for all platforms
 
Measuring social media
Measuring social mediaMeasuring social media
Measuring social media
 
TDR - Predstavljanje poslovanja za 2009. godinu
TDR - Predstavljanje poslovanja za 2009. godinuTDR - Predstavljanje poslovanja za 2009. godinu
TDR - Predstavljanje poslovanja za 2009. godinu
 
F2F 2015 - Client SDK (Specific Plataform Android)
F2F 2015 - Client SDK (Specific Plataform Android)F2F 2015 - Client SDK (Specific Plataform Android)
F2F 2015 - Client SDK (Specific Plataform Android)
 
Guia tecnica de control de signos vitales
Guia tecnica de control de signos vitalesGuia tecnica de control de signos vitales
Guia tecnica de control de signos vitales
 
Blignaut Visual Span And Other Parameters For The Generation Of Heatmaps
Blignaut Visual Span And Other Parameters For The Generation Of HeatmapsBlignaut Visual Span And Other Parameters For The Generation Of Heatmaps
Blignaut Visual Span And Other Parameters For The Generation Of Heatmaps
 
TEMA2AVocabulary
TEMA2AVocabularyTEMA2AVocabulary
TEMA2AVocabulary
 
Urbina Alternatives To Single Character Entry And Dwell Time Selection On Eye...
Urbina Alternatives To Single Character Entry And Dwell Time Selection On Eye...Urbina Alternatives To Single Character Entry And Dwell Time Selection On Eye...
Urbina Alternatives To Single Character Entry And Dwell Time Selection On Eye...
 
Representative Projects
Representative ProjectsRepresentative Projects
Representative Projects
 
Web 2 0
Web 2 0Web 2 0
Web 2 0
 
Acta ci 28 09-2012 logo
Acta ci 28 09-2012 logoActa ci 28 09-2012 logo
Acta ci 28 09-2012 logo
 

Semelhante a ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework приложения с помощью phpDaemon, Varnish и ESI (Алексей Качаев)

развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
guest40e031
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
rit2010
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
Ontico
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычность
Stepan Tanasiychuk
 
Пост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновениеПост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновение
beched
 
Инфраструктура социального проекта
Инфраструктура социального проектаИнфраструктура социального проекта
Инфраструктура социального проекта
Media Gorod
 

Semelhante a ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework приложения с помощью phpDaemon, Varnish и ESI (Алексей Качаев) (20)

развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 
Как быть с большими сайтами на Word press
Как быть с большими сайтами  на Word pressКак быть с большими сайтами  на Word press
Как быть с большими сайтами на Word press
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP Framework
 
мониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBAмониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBA
 
Zend Framework и мультиязычность
Zend Framework и мультиязычностьZend Framework и мультиязычность
Zend Framework и мультиязычность
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
Пост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновениеПост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновение
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
 
FT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это простоFT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это просто
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
 
DDOS mitigation software solutions
DDOS mitigation software solutionsDDOS mitigation software solutions
DDOS mitigation software solutions
 
PHP
PHPPHP
PHP
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
Инфраструктура социального проекта
Инфраструктура социального проектаИнфраструктура социального проекта
Инфраструктура социального проекта
 

Mais de ZFConf Conference

ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf Conference
 
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf Conference
 
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf Conference
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf Conference
 
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf Conference
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf Conference
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
ZFConf Conference
 
ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ruZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ru
ZFConf Conference
 
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend FrameworkZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf Conference
 
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework Applications
ZFConf Conference
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf Conference
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf Conference
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf Conference
 

Mais de ZFConf Conference (20)

ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
 
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
 
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
 
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
 
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
 
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
 
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
 
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
 
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ruZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ru
 
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend FrameworkZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
 
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework Applications
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
 

ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework приложения с помощью phpDaemon, Varnish и ESI (Алексей Качаев)

  • 1. Воюем за ресурсы: повышение производительности ZF приложения с помощью phpDaemon + Varnish + ESI
  • 2. Алексей Качаев Senior/Lead PHP Developer at Cogniance 4+ года опыта c PHP 3+ года использования Zend Framework Активный участник zendframework.ru/forum ZF2 contributor
  • 3. О чем мы будем говорить • о ресурсах и о том, почему их не хватает • о времени и о том, куда оно девается • о пользователях, современных веб-приложениях и о проблемах, с ними связанными • ...
  • 4. Как мы будем говорить 1. 2 проблемы в использовании ресурсов на реальных примерах из широкой практики 2. как эти пробемы можно решить быстро и практически безболезнено (как в новом, так и в функционирующем проекте) 3. контректный zf app и все шаги имплементации того, что описано в п. 2 Понимание проблем и путей их решения важно
  • 5. СХЕМЫ БОЕВЫХ ДЕЙСТВИЙ
  • 6. Проблема 1. Запросы и инициализация Пользователь -> Запрос к серверу = nginx + apache2 + php + Zend + application
  • 8. Проблема 1. Запросы и инициализация AJAX + Пользователь => Много запросов к серверу = (nginx + apache2 + php + Zend + application) * много Примеры: autosuggest-поле, валидация формы, загрузка виджетов и т.д.
  • 9. apache2 + mod_php + Zend + AJAX
  • 10. Проблема 1. Запросы и инициализация Rich application = AJAX * много = (nginx + apache2 + php + Zend + application) * много (в квадрате)
  • 11. Куда уходит время - создание объекта приложения - чтение и сборка конфигурации (тут даже кеш не спасает) - загрузка и инициализация ресурсов Затраты: до 40-60% времени выполнения.
  • 12. Как хотелось бы? (псевдо код) Framework::initialize(); while($request = Somewhere::request()) { // Тут мы что-то делаем // Отдаем ответ } Framework::shutdown();
  • 13. Особенности PHP реализации 1. Проблемы: - корявая реализация поддержки Fast-CGI на PHP 2. Существующие решения: - php-fpm (FastCGI Process Manager, http://php-fpm.org/) - phpDaemon
  • 14. phpDaemon в студии Основные возможности - WebSocket, HTTP, FastCGI, flash - асинхронные клиенты для MySQL, Memcache, MongoDB и других - динамическая перегрузка кода в демон при изменении файлов - статистика по количеству запросам, памяти и т.д. - гибкая настройка worker'ов ... - многое другое
  • 15. Схема того, как будет работать с phpDaemon
  • 16. Проблема 2. Кеширование HTML 1. Это заманчиво! - обслуживание большого количества подключений одновременно - возможность не инициализировать приложение вообще 2. Это проблематично! - "размазывание кеша" (для авторизированных пользователей, по cookies и т.д.) - точечная инвалидация = "микро-инфаркт" (например, блок последних комментариев на хабре)
  • 19. Проблема 2. Возьмем хитростью 1. Varnish, как промежуточный кеширующий сервер (caching HTTP reverse proxy) http://www.varnish-cache.org/ 2. ESI, как markup language связи логических кусков HTML http://en.wikipedia.org/wiki/Edge_Side_Includes <esi:include src="..." onerror="continue"/> 3. Nginx, как front web server http://nginx.org/
  • 20. Проблема 2. Расплата за хитрость ESI = Увеличение количества запросов к backend Большинство из этих запросов однотипно и нетребует мощностей всего приложения ВЕРНУЛИСЬ К ПРОБЛЕМЕ 1 Слава богу, мы уже знаем как ее решать.
  • 21. ОБЩАЯ СХЕМА РАБОТЫ С КЕШ-СЕРВЕРОМ И ДЕМОНАМИ
  • 22. Общая схема Прокси Статика на daemon Запросы на backend-ы Кеширование
  • 24. Демо приложение: "Конференция" 1. Список докладов из базы данных 2. Добавление докладов в избранное без регистрации 3. Форма поиска по докладам с "подсказыванием" тегов 4. ~ Вход/выход для зарегистрированных пользователей Sources https://github.com/kachayev/zfconf-speech
  • 28. phpDaemon: установка 1. Официальная документация https://github.com/kakserpom/phpdaemon/wiki/Installation- (common) 2. Используется PECL расширения libevent, proctitle (возможно потребуется пересборка PHP из исходников) http://tokarchuk.ru/2010/09/%D1%83%D1%81%D1%82%D0% B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0- phpdaemon-libevent-%D0%BD%D0%B0-ubuntu/ РУКОВОДСТВА БЫСТРО УСТАРЕВАЮТ
  • 29. phpDaemon: установка на Ubuntu 0. Нам понадобиться: php-dev, build-essential, git 1. Удаляем старую libevent1 2. Скачиваем новую из ветки 1.4 (2я пока в альфе). Далее наше любимое .configure && make && make install 3. Устанавливаем pecl extension libevent-0.0.4, добавляем его подгрузку в /etc/php5/cli/php.ini 4. Аналочиные действия с proctitle 5. Устанавливаем phpDaemon... ->
  • 30. phpDaemon: установка на Ubuntu cd /usr/local/lib git clone git://github.com/kakserpom/phpdaemon.git $path cd ./phpdaemon chmod +x ./bin/phpdaemon ln /usr/bin/phpdaemon /usr/local/lib/phpdaemon/bin/phpdaemon cp init-scripts/phpd /etc/init.d/ mkdir /etc/phpd/ && cp conf/phpd.conf.example /etc/phpd/phpd.conf /usr/local/lib/phpdaemon/bin/phpdaemon start В файл конфигурации добавляем следующее: HTTP { enable 1; listen 127.0.0.1; listen-port 8020; responder "Example" }
  • 31. phpDaemon: default application 1. Принимает HTTP запросы на порт, без р веб-сервера 2. Siege показал 370 обработанных реквестов в секунду при 100 одновременных подключениях.
  • 32. Прикручиваем к своему проекту 1. Выделяем консистентные блоки (autocomplete, autosuggest, рендеринг отдельных блоков, виджеты и т.д.) Важно! Операция на демоне должна затрагивать минимум различных частей приложения. Подходят: ajax-проверка полей формы, inline-редактирование данных, autosuggest/complete и т.д. 2. Отделяем выполнение (Ajax, SSI, ESI etc). 3. Поднимаем демон, реализованный как HTTP App (при желании можно и Fast CGI). (следующий слайд)
  • 33. Прикручиваем к своему проекту (прд.) Начинаем с Nginx-подобного конфиг-файла. /etc/phpd/phpd.conf Примечание: (Можно через AppResolver.php, но для простых случаев это overkill)
  • 34. phpDaemon + Zend Framework Responder application - класс, наследник AppInstance Должен реализовать следующие функции: init() - инициализация фреймворка (создаем Zend Application, бутстрапимся, получаем Front Controller) beginRequest() - вызывается, когда приложение получает новый Request для обработки (возвращаем специальный объект - наследник HTTPRequest) onReady() - вызывается после отработки инициализации onShutdown() - завершаем работу фрейморка
  • 35. phpDaemon + ZF (окружение) /usr/local/phpdaemon/applications/ZfconfApp.php
  • 36. phpDaemon + ZF (app instance)
  • 37. phpDaemon -> Request HTTPRequest содержит все нужные нам данные GET, POST, COOKIES, SESSION и т.д. В наследнике должны реализовать функции run() - передать в приложение новые суперглобальные, подготовить Response, должны вернуть Request::DONE (сбрасываем Request, Response объекты Front Controller'а и выполняем run()) onFinish() - возвращаем подготовленный ранее Response
  • 39. Nginx -> phpDaemon 4. Nginx "ловит" адрес и перенаправляет его на backend (HTTP, или FastCGI) Полный разбор nginx кофигурации не делаем. Только момент "перехвата" URL.
  • 40. Несколько замечаний (номер 1) Важно! При реализации данного подхода критически важно, чтобы инициализация (Bootstrap, Application Resources) не делала ничего request-зависимого. Например. Присваивание текущего языка (current language) в Bootstrap - это очень большая ошибка. Для этого есть плагины. (вспоминаем цикл диспечирезации).
  • 41. Несколько замечаний (номер 2) Важно! Внимательно следите, чтобы никто "не посмел" отправить клиенту хоть какие-то данные, до тех пор, пока это явно не сделает phpDaemon. Например. В коде Action'а: $this->_helper->json($data); Приведет к: (примеров много)
  • 43. Known issues 1. Debian, Ubuntu - проблемы с рестартом при "зависших" подключениях (аналогично Mongo). "Спасает": 2. Если работа ведется без веб-сервера, то нужно помнить о статике. Например, попытка обработать запрос /favicon.ico с помощью Zend отправляет phpDaemon в глубокий down. Т.е. без веб-сервера фильтруем статику в ручную.
  • 44. Что дальше? Неблокирующий MySQL драйвер Неблокирующий Memcache клиент И т.д. Как это работает? (на примере MySQL) 1. Запрос (обработчик) делает request на MySQL и вешает callback 2. Вызывается $this->sleep(30) - диспечер выбрасывает процесс из обработки, чтобы вернуться через 30 сек 3. В callback делается $this->wakeup()
  • 45. Что дальше? В последних версиях появилась возможность использовать Sandbox Fatal error воркера не приводит к перезапуску демона.
  • 46. Оценим полученный результат + Плюсы 1. Снижение нагрузки на сервер и потребляемых ресурсов 2. Уменьшение времени ожидания ответа - Минусы 1. Усложнение деплоя 2. Усложнение тестирования 3. Усложнение управления приложением
  • 47. Полезные материалы по теме 0. "Офф. сайт" http://phpdaemon.net/ 1. phpDaemon - фреймворк асинхронных приложений http://habrahabr.ru/blogs/php/79377/ 2. Wiki документация https://github.com/kakserpom/phpdaemon/wiki
  • 49. Varnish: сильные стороны 1. Мощный язык конфигурации VCL (Varnish Configuration Language) 2. Легкость горизонтального масштабирования 3. Возможность использования механизмов балансировки нагрзуки с учетом времени ответов и загруженности бекенд серверов 4. Поддержка ESI разметки 5. Большое количество отличных утилит для профайлирования и мониторинга
  • 51. Varhish: установка на Ubuntu cd /tmp sudo bash curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add - echo "deb http://repo.varnish-cache.org/ubuntu/ $(lsb_release -s -c) varnish-2.1" >> /etc/apt/source.list apt-get update && apt-get install varnish # Далее вы можете использовать init-скрипт * Usage: /etc/init.d/varnish {start|stop|restart|force-reload} Установка на других платформах: http://www.varnish-cache.org/docs Установка web-based admin console: http://www.varnish-cache.org/trac/wiki/WebGui
  • 52. Конфигурация демона /etc/default/varnish для Ubuntu - необходимость запуска демона START=yes - порт, который будет слушать демон (:81)
  • 54. VCL файл /etc/varnish/varnish.vcl - описание процедур hash, fetch, deliver, hit, recv
  • 55. VCL файл /etc/varnish/varnish.vcl - описание процедур hash, fetch, deliver, hit, recv
  • 57. VCL файл /etc/varnish/varnish.vcl - описание процедур hash, fetch, deliver, hit, recv
  • 59. PhpDaemon workers В указанном выше примере использовался один и тот же ZfconfApp на порту 8091. Но, часто есть смысл разграничивать обработчики: - отдельный worker на autosuggest - отдельный worker на рендеринг AJAX-видета В таких случаях используется AppResolver.php (можно прописывать правила "раздачи" запросов на worker-ы).
  • 60. Использование ESI Основное - Формат: <esi:include src="" /> - Директивы alt и onerror на данный момент не поддерживаются - для Zend-a самописный View Helper (рендер include и отправление заголовка esi-enabled)
  • 61. Использование ESI Обратить внимание - отключаем сжатие (nginx: gzip off, apache2: no deflate) - проблемы с ETag, If-Non-Match - отслеживание поведения кеша по URL (nginx rewrite, apache2 rewrite, Zend routing, URL-mark etc) - готовьтесь к сюрпризам :)
  • 62. А можно ли по другому? По аналогу со схемой Nginx + Varnish + ESI можно использовать схему Nginx + SSI + Memcache Минусы - nginx не умеет писать контент в memcache (нужно писать со стороны backend-a) - слабые возможности конфигурирования кеш-ключа - сложно управлять кешированием
  • 63. Подводные камни 1. Правильность разграничения контента Например, если HTML различается по языку, хранящемуся в cookies, то это нужно учитывать.
  • 64. Подводные камни 2. Очистка выполняется через CLI или отправкой запроса HTTP PURGE Не самая простая процедура, поэтому для dev-режима нужно предусмотреть возможность работы с TTL=0. Очистка varnish-кеша по объекто-зависимым событиям. Пример: очистить кеш списка докладов после внесения изменений пользователем. - переопределить CacheManager - обернуть необходимые cache backend в специальные враппер
  • 65. Подводные камни Конкретная реализация зависит от общей схемы работы с кешем
  • 66. Подводные камни 3. Управление кешем со стороны клиента (Cache-Control, etc) В demo app есть пример работы заголовками клиента 4. Документация во многом не соответствует правде.
  • 67. Нагрузочное тестирование результата Не очень информативно и предсказуемо, но по факту: ab -n 100 -c 5 http://zfconf.loc/ Преимущество: response time практически не увеличивается при повышении concurrency level.
  • 68. Ссылки на полезные материалы Varnish docs and tutorials: • http://www.varnish-cache.org/docs/2.1/index.html • http://www.ibm.com/developerworks/opensource/library/os-php- varnish/?ca=dgr-lnxw06Varnish-PHP • http://www.mediawiki.org/wiki/Manual:Varnish_caching ESI: • http://www.varnish-cache.org/trac/wiki/ESIfeatures • http://cd34.com/blog/infrastructure/no-esi-processing-first-char-not/ VCL: • http://www.varnish-cache.org/docs/2.1/tutorial/vcl.html