Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Phalcon - cамый быстрый PHP Framework. Разработка highload проекта

fwdays
October 18, 2013

Phalcon - cамый быстрый PHP Framework. Разработка highload проекта

fwdays

October 18, 2013
Tweet

More Decks by fwdays

Other Decks in Programming

Transcript

  1. Преимущества работы с фреймворками • Однородная архитектура приложения • DRY

    code • Широкий набор готового инструментария • Высокая скорость разработки • Возможность строить гибкие и масштабируемые приложения • …
  2. Недостатки фреймворков • Большое количество файлов • Каждый запрос к

    серверу ~ 40-60 .php файлов • Код фреймворка интерпретируется для каждого запроса заново • Большой аппетит на системные ресурсы • Относительно низкая устойчивость к нагрузкам
  3. Как заставить фреймворк работать быстрее? • Сделать сборку в один

    файл • HTTP-прокси кеш, например Varnish • Переписать dispatcher под себя • Написать свой MVC • Кешировать все вдоль и поперек • … • Как-то работать с этим всем дальше
  4. Нагрузочный тест Hello World 354 489 541 851 860 1059

    2535 Zend Laravel Symfony Yii Kohana Codeigniter Phalcon Requests per second
  5. Потребление памяти 1,75 1,50 1,50 1,25 1,25 1,10 0,25 Zend

    Yii Symfony Laravel Kohana Codeigniter Phalcon Megabytes per request
  6. Особенности Phalcon • Написан на Си • Работает как extension

    для PHP • Уже скомпилирован и не требует интерпретации • Находится в оперативной памяти • Требует минимум файловых операций • Потребляет мало ресурсов • Очень производительный • Не требует от разработчика знаний Си • Бубен нам уже не нужен 
  7. Компоненты • Routing • Cache • Pagination • Annotations •

    Security • Translations • Assets Management • Auto-Loader • Logging • CLI • ODM для Mongo • ORM • Шаблонизатор Volt • DI / IOC • Events Management • Encryption • HTTP Request / Response / Cookies • Escaping / Filtering • Forms • Flash Messages
  8. Auto-Loader $loader = new Phalcon\Loader(); $loader->registerNamespaces(array( 'Zend' => __DIR__ .

    '/../vendor/zendframework/zendframework/library/Zend', 'Application' => __DIR__ . '/modules/Application', 'Index' => __DIR__ . '/modules/Index', 'Blog' => __DIR__ . '/modules/Blog', )); $loader->register(); • Na++mespaces • Prefixes (ZF1-style) • Directories • Classes • Любые расширения файлов (.php, .inc, .phb … )
  9. Dependency Injection Container // Инициализация сервисов приложения $view = new

    Phalcon\Mvc\View(); $view->setPartialsDir(/*some dir*/); $di->set('view', $view); // Переопределение сервиса, например в Module.php $view = $di->get('view'); $view->setViewsDir(/*some dir*/); $di->set('view', $view);
  10. Routing $router->add('/:module/:controller/:action/:params', array( 'module' => 1, 'controller' => 2, 'action'

    => 3, 'params' => 4 )); // REQUEST_URI = '/blog/admin/index/3' // Namespace Blog\Controller\AdminController public function editAction($id) { // id = '3' (string) } Default router Обработка параметров в контроллере
  11. Routing $router->add( "/admin/:controller/a/:action/:params", array( "controller" => 1, "action" => 2,

    "params" => 3, )); $router->add( "/blog/{id:[0-9]+}/{slug:[a-z\-]+}", "Blog\IndexController::post" ); Предопределенные плейсхолдеры Пользовательские плейсхолдеры и короткий синтаксис
  12. Routing $router->add( "/blog/([0-9]+)/([a-z\-]+)(/([0-9]+))?", array( "module" => "blog", "controller" => "index",

    "action" => "archive", "year" => 1, "month" => 2, "page" => 4 ) ); Регулярные выражения
  13. Routing $blog = new \Phalcon\Mvc\Router\Group( array( 'module' => 'blog', 'controller'

    => 'index' ) ); $blog->setPrefix('/blog'); $blog->add('/{slug:[a-z0-9_-]+}.html', array( 'action' => 'post', ) )->setName('blog/post'); $router->mount($blog); Группы маршрутов
  14. Routing // This route only will be matched if the

    HTTP method is GET $router->addGet("/products/edit/{id}", "Products::edit"); // This route only will be matched if the HTTP method is POST $router->addPost("/products/save", "Products::save"); // This route will be matched if the HTTP method is POST or PUT $router->add("/products/update")->via(array("POST", "PUT")); Маршруты для определенных типов HTTP-запросов RESTful applications friendly
  15. Routing /** * @RoutePrefix("/api/products") */ class ProductsController { /** *

    @Get("/edit/{id:[0-9]+}", name="edit-robot") */ public function editAction($id) { } /** * @Route("/save", methods={"POST", "PUT"}, name="save-robot") */ public function saveAction() { } } Аннотации
  16. Cache Backend Adapters: • File • Memcached • APC •

    Mongo • XCache Используется в: • View • Models • ModelsMetadata • Annotations
  17. Cache use Phalcon\Cache\Multiple, Phalcon\Cache\Backend\Apc as ApcCache, Phalcon\Cache\Backend\Memcache as MemcacheCache, Phalcon\Cache\Backend\File

    as FileCache; $cache = new Multiple(array( new ApcCache($ultraFastFrontend, array( "prefix" => 'cache', )), new MemcacheCache($fastFrontend, array( "prefix" => 'cache', "host" => "localhost", "port" => "11211" )), new FileCache($slowFrontend, array( "prefix" => 'cache', "cacheDir" => "../app/cache/" )) )); Многоуровневый кеш
  18. Volt: Template Engine • Шаблонизатор • Написан на Си •

    Ультра-быстрый • Синтаксис похожий на Jinja (python), Twig (php) • Имеет высокую степень интеграции с сервисами Phalcon
  19. Возможности Volt • Работа с переменными приложения • Фильтрация данных

    вывода • Логические выражения и операторы • Математические выражения • Работа с массивами • Макросы • Добавление своих функций • Кеширование
  20. Пример шаблона Volt <!DOCTYPE html> <html> <head> <title>{{ title }}

    - An example blog</title> </head> <body> {% if show_navigation %} <ul id="navigation"> {% for item in menu %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> {% endif %} <h1>{{ post.title }}</h1> <div class="content"> {{ post.content }} </div> </body> </html>
  21. ORM • Работа с сущностями • Реляционные связи • Удобные

    методы find, findFirst с параметрами выборки • Phalcon Query Language • Query Builder • Валидации • Гидрации • Кеширование • События/Events • Транзакции • Models Meta-Data • Аннотации • Логирование • Профилирование • Шардинг
  22. Пример простого контроллера public function indexAction() { $posts = Post::find(array('sort'

    => array('created_at' => 'desc')) ); $this->view->posts = $posts; } public function postAction($slug) { $post = Post::findFirst( array("slug = '{$slug}'", 'cache' => array( 'lifetime' => 30, 'key' => "Post::findBySlug(" . md5($slug) . ")" )) ); $this->view->post = $post; $this->tag->prependTitle($post->getTitle()); }
  23. Хотелось бы упомянуть • Развитый View Layer • Assets Manager

    для минификации и билдинга CSS, JS файлов • ODM для MongoDb • UNIT Testing
  24. Higload проект Gazeta.ua • ZendFramework 1.11 • ORM Doctrine 1.24

    • MySQL Достижение производительности • Изменение MVC • Varnish HTTP-proxy • Полное кеширование страниц • Блочное кеширование
  25. Higload проект Gazeta.ua Web-server 8 x Intel(R) Xeon(R) CPU E5506

    @ 2.13GHz Total Memory 32 Gb Middle Load avg. ~ 3.5 DB-server 8 x Intel(R) Xeon(R) CPU E5506 @ 2.13GHz Total Memory 16 Gb Middle Load avg. ~ 2.1 Хиты ~ 800 000 Хосты ~ 140 000 Средний онлайн ~ 2500 Максимальный онлайн ~ 8000
  26. Нагрузочное тестирование Gazeta.ua # ab -n 2000 -c 10 http://gazeta.ua/

    Requests per second: 67.24 [#/sec] (mean) # ab -n 2000 -c 10 http://gazeta.ua/ Requests per second: 9.08 [#/sec] (mean) Varnish, многоуровневое кеширование, MySQL MySQL Web-server CRASHED ~ 8000 онлайн
  27. Dev-версия Gazeta.ua на Phalcon # ab -n 2000 -c 10

    http://gazeta_phalcon.local/ Requests per second: 598.74 [#/sec] (mean) # ab -n 2000 -c 10 http:// gazeta_phalcon.local / Requests per second: 101.92 [#/sec] (mean) Кеширование виджетов, MongoDb MongoDb
  28. Перспективы развития Phalcon Проблема: • Исходный код на Си •

    Низкая скорость развития фреймворка Решение: • Создание новой версии Phalcon 2.0, которая будет написана на Zephir – мощный и простой язык понятный любому PHP-разработчику
  29. Zephir class MyTest { public function someMethod() { /* Variables

    must be declared */ var fruits; int i = 0, length; /* Create PHP array */ let myArray = ["hello", 0, 100.25, false, null]; /* count the array into a 'int' variable */ let length = count(myArray); /* Print value types */ while i < length { echo typeof myArray[i], "\n"; let i++; } return fruits; } }
  30. Выводы • Phalcon даёт нам новый, свежий взгляд на PHP

    фреймворки • Phalcon – это очень быстрый и богатый функционалом фреймворк • На нем можно смело разрабатывать Production приложения • Очень большие перспективы развития