Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Phalcon - самый быстрый PHP Framework

4,420 views

Published on

Мой доклад на конференции "Php frameworks day 2013"

Published in: Technology
  • Be the first to comment

Phalcon - самый быстрый PHP Framework

  1. 1. Phalcon – самый быстрый PHP фреймворк Александр Торош Веб-студия «WeZoom» oleksandr.torosh@wezoom.net
  2. 2. В мире PHP фреймворков • ZendFramework • Symfony • Yii • Laravel • Kohana
  3. 3. Преимущества работы с фреймворками • • • • • • Однородная архитектура приложения DRY code Широкий набор готового инструментария Высокая скорость разработки Возможность строить гибкие и масштабируемые приложения …
  4. 4. Недостатки фреймворков • • • • • Большое количество файлов Каждый запрос к серверу ~ 40-60 .php файлов Код фреймворка интерпретируется для каждого запроса заново Большой аппетит на системные ресурсы Относительно низкая устойчивость к нагрузкам
  5. 5. Как заставить фреймворк работать быстрее?
  6. 6. Как заставить фреймворк работать быстрее? • • • • • • • Сделать сборку в один файл HTTP-прокси кеш, например Varnish Переписать dispatcher под себя Написать свой MVC Кешировать все вдоль и поперек … Как-то работать с этим всем дальше
  7. 7. Нагрузочный тест Hello World Requests per second 2535 1059 851 489 Symfony Yii Kohana 541 Laravel 860 354 Zend Codeigniter Phalcon
  8. 8. Потребление памяти Megabytes per request 1,75 1,50 1,50 1,25 1,25 1,10 0,25 Zend Yii Symfony Laravel Kohana Codeigniter Phalcon
  9. 9. Phalcon PHP Framework
  10. 10. Особенности Phalcon • • • • • • • • • Написан на Си Работает как extension для PHP Уже скомпилирован и не требует интерпретации Находится в оперативной памяти Требует минимум файловых операций Потребляет мало ресурсов Очень производительный Не требует от разработчика знаний Си Бубен нам уже не нужен 
  11. 11. Компоненты • • • • • • • • • • ODM для Mongo ORM Шаблонизатор Volt DI / IOC Events Management Encryption HTTP Request / Response / Cookies Escaping / Filtering Forms Flash Messages • • • • • • • • • • Routing Cache Pagination Annotations Security Translations Assets Management Auto-Loader Logging CLI
  12. 12. Готовое приложение на Github https://github.com/ oleksandr-torosh/phalcon-modular-app
  13. 13. Auto-Loader $loader = new PhalconLoader(); $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 … )
  14. 14. Dependency Injection Container ssd
  15. 15. Dependency Injection Container // Инициализация сервисов приложения $view = new PhalconMvcView(); $view->setPartialsDir(/*some dir*/); $di->set('view', $view); // Переопределение сервиса, например в Module.php $view = $di->get('view'); $view->setViewsDir(/*some dir*/); $di->set('view', $view);
  16. 16. Routing Default router $router->add('/:module/:controller/:action/:params', array( 'module' => 1, 'controller' => 2, 'action' => 3, 'params' => 4 )); Обработка параметров в контроллере // REQUEST_URI = '/blog/admin/index/3' // Namespace BlogControllerAdminController public function editAction($id) { // id = '3' (string) }
  17. 17. Routing Предопределенные плейсхолдеры $router->add( "/admin/:controller/a/:action/:params", array( "controller" => 1, "action" => 2, "params" => 3, )); Пользовательские плейсхолдеры и короткий синтаксис $router->add( "/blog/{id:[0-9]+}/{slug:[a-z-]+}", "BlogIndexController::post" );
  18. 18. Routing Регулярные выражения $router->add( "/blog/([0-9]+)/([a-z-]+)(/([0-9]+))?", array( "module" => "blog", "controller" => "index", "action" => "archive", "year" => 1, "month" => 2, "page" => 4 ) );
  19. 19. Routing Группы маршрутов $blog = new PhalconMvcRouterGroup( array( 'module' => 'blog', 'controller' => 'index' ) ); $blog->setPrefix('/blog'); $blog->add('/{slug:[a-z0-9_-]+}.html', array( 'action' => 'post', ) )->setName('blog/post'); $router->mount($blog);
  20. 20. Routing Маршруты для определенных типов HTTP-запросов // 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")); RESTful applications friendly
  21. 21. 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() { } }
  22. 22. Cache Backend Adapters: • File • Memcached • APC • Mongo • XCache Используется в: • View • Models • ModelsMetadata • Annotations
  23. 23. Cache Многоуровневый кеш use PhalconCacheMultiple, PhalconCacheBackendApc as ApcCache, PhalconCacheBackendMemcache as MemcacheCache, PhalconCacheBackendFile 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/" )) ));
  24. 24. Volt: Template Engine • • • • • Шаблонизатор Написан на Си Ультра-быстрый Синтаксис похожий на Jinja (python), Twig (php) Имеет высокую степень интеграции с сервисами Phalcon
  25. 25. Возможности Volt • • • • • • • • Работа с переменными приложения Фильтрация данных вывода Логические выражения и операторы Математические выражения Работа с массивами Макросы Добавление своих функций Кеширование
  26. 26. Пример шаблона 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>
  27. 27. ORM • • • • • • • • • Работа с сущностями Реляционные связи Удобные методы find, findFirst с параметрами выборки Phalcon Query Language Query Builder Валидации Гидрации Кеширование События/Events • • • • • • Транзакции Models Meta-Data Аннотации Логирование Профилирование Шардинг
  28. 28. Пример простого контроллера 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()); }
  29. 29. Developer Tools / Консоль
  30. 30. Developer Tools / Web-интерфейс
  31. 31. Хотелось бы упомянуть • • • • Развитый View Layer Assets Manager для минификации и билдинга CSS, JS файлов ODM для MongoDb UNIT Testing
  32. 32. Higload проект Gazeta.ua • • • ZendFramework 1.11 ORM Doctrine 1.24 MySQL Достижение производительности • Изменение MVC • Varnish HTTP-proxy • Полное кеширование страниц • Блочное кеширование
  33. 33. Higload проект Gazeta.ua Хиты ~ 800 000 Хосты ~ 140 000 Средний онлайн ~ 2500 Максимальный онлайн ~ 8000 Web-server DB-server 8 x Intel(R) Xeon(R) CPU E5506 @ 2.13GHz Total Memory 32 Gb 8 x Intel(R) Xeon(R) CPU E5506 @ 2.13GHz Total Memory 16 Gb Middle Load avg. ~ 3.5 Middle Load avg. ~ 2.1
  34. 34. Нагрузочное тестирование Gazeta.ua Varnish, многоуровневое кеширование, MySQL # ab -n 2000 -c 10 http://gazeta.ua/ Requests per second: 67.24 [#/sec] (mean) MySQL # ab -n 2000 -c 10 http://gazeta.ua/ Requests per second: 9.08 [#/sec] (mean) Web-server CRASHED ~ 8000 онлайн
  35. 35. Dev-версия Gazeta.ua на Phalcon Кеширование виджетов, MongoDb # ab -n 2000 -c 10 http://gazeta_phalcon.local/ Requests per second: 598.74 [#/sec] (mean) MongoDb # ab -n 2000 -c 10 http:// gazeta_phalcon.local / Requests per second: 101.92 [#/sec] (mean)
  36. 36. Dev-версия Gazeta.ua на Phalcon 598,74 101,92 67,24 9,08 ZF1 ZF1+cache Phalcon Phalcon+cache
  37. 37. Перспективы развития Phalcon Проблема: • Исходный код на Си • Низкая скорость развития фреймворка Решение: • Создание новой версии Phalcon 2.0, которая будет написана на Zephir – мощный и простой язык понятный любому PHP-разработчику
  38. 38. 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; } }
  39. 39. Официальный сайт http://phalconphp.com/
  40. 40. Github https://github.com/phalcon/cphalcon
  41. 41. Сообщество http://forum.phalconphp.com/
  42. 42. Выводы • • • • Phalcon даёт нам новый, свежий взгляд на PHP фреймворки Phalcon – это очень быстрый и богатый функционалом фреймворк На нем можно смело разрабатывать Production приложения Очень большие перспективы развития
  43. 43. Вопросы Александр Торош Веб-студия «WeZoom» wezoom.com.ua oleksandr.torosh@wezoom.net Тел: (044) 221-65-78 (096) 989-08-28 (063) 787-22-36

×