Slide 1

Slide 1 text

Phalcon – самый быстрый PHP фреймворк Александр Торош Веб-студия «WeZoom» [email protected]

Slide 2

Slide 2 text

В мире PHP фреймворков • ZendFramework • Symfony • Yii • Laravel • Kohana

Slide 3

Slide 3 text

Преимущества работы с фреймворками • Однородная архитектура приложения • DRY code • Широкий набор готового инструментария • Высокая скорость разработки • Возможность строить гибкие и масштабируемые приложения • …

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Как заставить фреймворк работать быстрее?

Slide 6

Slide 6 text

Как заставить фреймворк работать быстрее? • Сделать сборку в один файл • HTTP-прокси кеш, например Varnish • Переписать dispatcher под себя • Написать свой MVC • Кешировать все вдоль и поперек • … • Как-то работать с этим всем дальше

Slide 7

Slide 7 text

Нагрузочный тест Hello World 354 489 541 851 860 1059 2535 Zend Laravel Symfony Yii Kohana Codeigniter Phalcon Requests per second

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Phalcon PHP Framework

Slide 10

Slide 10 text

Особенности Phalcon • Написан на Си • Работает как extension для PHP • Уже скомпилирован и не требует интерпретации • Находится в оперативной памяти • Требует минимум файловых операций • Потребляет мало ресурсов • Очень производительный • Не требует от разработчика знаний Си • Бубен нам уже не нужен 

Slide 11

Slide 11 text

Компоненты • 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

Slide 12

Slide 12 text

Готовое приложение на Github https://github.com/ oleksandr-torosh/phalcon-modular-app

Slide 13

Slide 13 text

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 … )

Slide 14

Slide 14 text

Dependency Injection Container ssd

Slide 15

Slide 15 text

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);

Slide 16

Slide 16 text

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 Обработка параметров в контроллере

Slide 17

Slide 17 text

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" ); Предопределенные плейсхолдеры Пользовательские плейсхолдеры и короткий синтаксис

Slide 18

Slide 18 text

Routing $router->add( "/blog/([0-9]+)/([a-z\-]+)(/([0-9]+))?", array( "module" => "blog", "controller" => "index", "action" => "archive", "year" => 1, "month" => 2, "page" => 4 ) ); Регулярные выражения

Slide 19

Slide 19 text

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); Группы маршрутов

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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() { } } Аннотации

Slide 22

Slide 22 text

Cache Backend Adapters: • File • Memcached • APC • Mongo • XCache Используется в: • View • Models • ModelsMetadata • Annotations

Slide 23

Slide 23 text

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/" )) )); Многоуровневый кеш

Slide 24

Slide 24 text

Volt: Template Engine • Шаблонизатор • Написан на Си • Ультра-быстрый • Синтаксис похожий на Jinja (python), Twig (php) • Имеет высокую степень интеграции с сервисами Phalcon

Slide 25

Slide 25 text

Возможности Volt • Работа с переменными приложения • Фильтрация данных вывода • Логические выражения и операторы • Математические выражения • Работа с массивами • Макросы • Добавление своих функций • Кеширование

Slide 26

Slide 26 text

Пример шаблона Volt {{ title }} - An example blog {% if show_navigation %} {% endif %}

{{ post.title }}

{{ post.content }}

Slide 27

Slide 27 text

ORM • Работа с сущностями • Реляционные связи • Удобные методы find, findFirst с параметрами выборки • Phalcon Query Language • Query Builder • Валидации • Гидрации • Кеширование • События/Events • Транзакции • Models Meta-Data • Аннотации • Логирование • Профилирование • Шардинг

Slide 28

Slide 28 text

Пример простого контроллера 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()); }

Slide 29

Slide 29 text

Developer Tools / Консоль

Slide 30

Slide 30 text

Developer Tools / Web-интерфейс

Slide 31

Slide 31 text

Хотелось бы упомянуть • Развитый View Layer • Assets Manager для минификации и билдинга CSS, JS файлов • ODM для MongoDb • UNIT Testing

Slide 32

Slide 32 text

Higload проект Gazeta.ua • ZendFramework 1.11 • ORM Doctrine 1.24 • MySQL Достижение производительности • Изменение MVC • Varnish HTTP-proxy • Полное кеширование страниц • Блочное кеширование

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

Нагрузочное тестирование 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 онлайн

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

9,08 67,24 101,92 598,74 ZF1 ZF1+cache Phalcon Phalcon+cache Dev-версия Gazeta.ua на Phalcon

Slide 37

Slide 37 text

Перспективы развития Phalcon Проблема: • Исходный код на Си • Низкая скорость развития фреймворка Решение: • Создание новой версии Phalcon 2.0, которая будет написана на Zephir – мощный и простой язык понятный любому PHP-разработчику

Slide 38

Slide 38 text

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; } }

Slide 39

Slide 39 text

Официальный сайт http://phalconphp.com/

Slide 40

Slide 40 text

Github https://github.com/phalcon/cphalcon

Slide 41

Slide 41 text

Сообщество http://forum.phalconphp.com/

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

Вопросы Александр Торош Веб-студия «WeZoom» wezoom.com.ua [email protected] Тел: (044) 221-65-78 (096) 989-08-28 (063) 787-22-36