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

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

Phalcon – самый быстрый PHP фреймворк

Александр Торош

Веб-студия «WeZoom»

[email protected]

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

В мире PHP фреймворков

• ZendFramework

• Symfony

• Yii

• Laravel

• Kohana

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

Преимущества работы с фреймворками

• Однородная архитектура приложения

• DRY code

• Широкий набор готового

инструментария

• Высокая скорость разработки

• Возможность строить гибкие и

масштабируемые приложения

• …

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

Недостатки фреймворков

• Большое количество файлов

• Каждый запрос к серверу

~ 40-60 .php файлов

• Код фреймворка интерпретируется для

каждого запроса заново

• Большой аппетит на системные

ресурсы

• Относительно низкая устойчивость к

нагрузкам

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

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

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

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

• Сделать сборку в один файл

• HTTP-прокси кеш, например Varnish

• Переписать dispatcher под себя

• Написать свой MVC

• Кешировать все вдоль и поперек

• …

• Как-то работать с этим всем дальше

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

Нагрузочный тест Hello World

354 489 541

851 860

1059

2535

Zend Laravel Symfony Yii Kohana Codeigniter Phalcon

Requests per second

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

Потребление памяти

1,75

1,50 1,50

1,25 1,25

1,10

0,25

Zend Yii Symfony Laravel Kohana Codeigniter Phalcon

Megabytes per request

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

Phalcon PHP Framework

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

Особенности Phalcon

• Написан на Си

• Работает как extension для PHP

• Уже скомпилирован и не требует

интерпретации

• Находится в оперативной памяти

• Требует минимум файловых операций

• Потребляет мало ресурсов

• Очень производительный

• Не требует от разработчика знаний Си

• Бубен нам уже не нужен

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

Компоненты

• 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

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

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

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

Dependency Injection Container

ssd

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

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

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

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

Обработка параметров в контроллере

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

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"

);

Предопределенные плейсхолдеры

Пользовательские плейсхолдеры и короткий синтаксис

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

Routing

$router->add(

"/blog/([0-9]+)/([a-z\-]+)(/([0-9]+))?",

array(

"module" => "blog",

"controller" => "index",

"action" => "archive",

"year" => 1,

"month" => 2,

"page" => 4

)

);

Регулярные выражения

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

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

Группы маршрутов

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

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

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

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

{

}

}

Аннотации

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

Cache

Backend Adapters:

• File

• Memcached

• APC

• Mongo

• XCache

Используется в:

• View

• Models

• ModelsMetadata

• Annotations

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

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/"

))

));

Многоуровневый кеш

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

Volt: Template Engine

• Шаблонизатор

• Написан на Си

• Ультра-быстрый

• Синтаксис похожий на Jinja (python),

Twig (php)

• Имеет высокую степень интеграции с

сервисами Phalcon

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

Возможности Volt

• Работа с переменными приложения

• Фильтрация данных вывода

• Логические выражения и операторы

• Математические выражения

• Работа с массивами

• Макросы

• Добавление своих функций

• Кеширование

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

Пример шаблона 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>

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

ORM

• Работа с сущностями

• Реляционные связи

• Удобные методы find,

findFirst с параметрами

выборки

• Phalcon Query Language

• Query Builder

• Валидации

• Гидрации

• Кеширование

• События/Events

• Транзакции

• Models Meta-Data

• Аннотации

• Логирование

• Профилирование

• Шардинг

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

Пример простого контроллера

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

}

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

Developer Tools / Консоль

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

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

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

Хотелось бы упомянуть

• Развитый View Layer

• Assets Manager для минификации и

билдинга CSS, JS файлов

• ODM для MongoDb

• UNIT Testing

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

Higload проект Gazeta.ua

• ZendFramework 1.11

• ORM Doctrine 1.24

• MySQL

Достижение производительности

• Изменение MVC

• Varnish HTTP-proxy

• Полное кеширование страниц

• Блочное кеширование

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

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

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

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

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

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

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

9,08

67,24 101,92

598,74

ZF1 ZF1+cache Phalcon Phalcon+cache

Dev-версия Gazeta.ua на Phalcon

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

Перспективы развития Phalcon

Проблема:

• Исходный код на Си

• Низкая скорость развития фреймворка

Решение:

• Создание новой версии Phalcon 2.0, которая

будет написана на Zephir – мощный

и простой язык понятный любому

PHP-разработчику

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

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;

}

}

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

Официальный сайт

http://phalconphp.com/

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

Github

https://github.com/phalcon/cphalcon

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

Сообщество

http://forum.phalconphp.com/

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

Выводы

• Phalcon даёт нам новый, свежий взгляд

на PHP фреймворки

• Phalcon – это очень быстрый и богатый

функционалом фреймворк

• На нем можно смело разрабатывать

Production приложения

• Очень большие перспективы развития

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

Вопросы

Александр Торош Веб-студия «WeZoom»

wezoom.com.ua

[email protected]

Тел: (044) 221-65-78

(096) 989-08-28

(063) 787-22-36