SlideShare a Scribd company logo
Phalcon – самый быстрый
PHP фреймворк
Александр Торош
Веб-студия «WeZoom»
oleksandr.torosh@wezoom.net
В мире PHP фреймворков
•

ZendFramework

•

Symfony

•

Yii

•

Laravel

•

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

•
•

•

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

•

•

•

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

•
•
•

Сделать сборку в один файл
HTTP-прокси кеш, например Varnish
Переписать dispatcher под себя
Написать свой MVC
Кешировать все вдоль и поперек
…
Как-то работать с этим всем дальше
Нагрузочный тест Hello World
Requests per second

2535

1059

851
489

Symfony

Yii

Kohana

541

Laravel

860

354

Zend

Codeigniter

Phalcon
Потребление памяти
Megabytes per request
1,75
1,50

1,50
1,25

1,25

1,10

0,25

Zend

Yii

Symfony

Laravel

Kohana

Codeigniter

Phalcon
Phalcon PHP Framework
Особенности Phalcon
•
•
•

•
•
•

•
•
•

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

•

•

•
•

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
Готовое приложение на Github
https://github.com/
oleksandr-torosh/phalcon-modular-app
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 … )
Dependency Injection Container

ssd
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);
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)
}
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"
);
Routing
Регулярные выражения
$router->add(
"/blog/([0-9]+)/([a-z-]+)(/([0-9]+))?",
array(
"module" => "blog",
"controller" => "index",
"action"
=> "archive",
"year"
=> 1,
"month"
=> 2,
"page"
=> 4
)
);
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);
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
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()
{
}
}
Cache
Backend Adapters:
• File
• Memcached
• APC
• Mongo
• XCache

Используется в:
• View
• Models
• ModelsMetadata
• Annotations
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/"
))
));
Volt: Template Engine
•
•
•
•

•

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

•
•
•
•

Работа с переменными приложения
Фильтрация данных вывода
Логические выражения и операторы
Математические выражения
Работа с массивами
Макросы
Добавление своих функций
Кеширование
Пример шаблона 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>
ORM
•
•

•

•
•
•

•
•
•

Работа с сущностями
Реляционные связи
Удобные методы find,
findFirst с параметрами
выборки
Phalcon Query Language
Query Builder
Валидации
Гидрации
Кеширование
События/Events

•
•
•
•

•
•

Транзакции
Models Meta-Data
Аннотации
Логирование
Профилирование
Шардинг
Пример простого контроллера
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());
}
Developer Tools / Консоль
Developer Tools / Web-интерфейс
Хотелось бы упомянуть
•
•

•

•

Развитый View Layer
Assets Manager для минификации и
билдинга CSS, JS файлов
ODM для MongoDb
UNIT Testing
Higload проект Gazeta.ua
•
•
•

ZendFramework 1.11
ORM Doctrine 1.24
MySQL

Достижение производительности
• Изменение MVC
• Varnish HTTP-proxy
• Полное кеширование страниц
• Блочное кеширование
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
Нагрузочное тестирование 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 онлайн
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)
Dev-версия Gazeta.ua на Phalcon

598,74

101,92
67,24
9,08

ZF1

ZF1+cache

Phalcon

Phalcon+cache
Перспективы развития Phalcon
Проблема:
• Исходный код на Си
• Низкая скорость развития фреймворка

Решение:
• Создание новой версии Phalcon 2.0, которая
будет написана на Zephir – мощный
и простой язык понятный любому
PHP-разработчику
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;
}
}
Официальный сайт
http://phalconphp.com/
Github
https://github.com/phalcon/cphalcon
Сообщество
http://forum.phalconphp.com/
Выводы
•

•

•

•

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

wezoom.com.ua

oleksandr.torosh@wezoom.net

Тел: (044) 221-65-78
(096) 989-08-28
(063) 787-22-36

More Related Content

PDF
Phalcon. Что нового?
PDF
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
PPTX
Александр Трищенко: Phalcon framework
PPT
Web programming modern tendencies
PPTX
Vagrant puppet
PPT
Catalyst – MVC framework на Perl (RIT 2008)
PDF
JavaScript завтра
PDF
WebAssembly
Phalcon. Что нового?
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
Александр Трищенко: Phalcon framework
Web programming modern tendencies
Vagrant puppet
Catalyst – MVC framework на Perl (RIT 2008)
JavaScript завтра
WebAssembly

What's hot (20)

PDF
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
PPT
Flex Data Access
KEY
Symfony as the platform for open source projects (sympal, apostrophe, diem)
PPTX
Meet Magento Belarus - Alexander Kaigorodov
PDF
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
PPTX
антон веснин Rails Application Servers
PPTX
Как делать качественные PBN и следить за ними когда их более 1000
PDF
webpack: 7 бед - один ответ
PDF
"Доклад не про React", Антон Виноградов, MoscowJS 27
PPTX
Sql server clr integration
PPTX
Презентация «WebMarkupMin – HTML-минификатор для платформы .NET» с MskDotNet ...
PDF
Изоморфные react-приложения
PDF
PDF
Изоморфные React-приложения: производительность и масштабирование
PPTX
Streaming media servers: FMS/Wowza
PDF
Фронтенд разработка без боли
PPTX
Платформа .NET Core глазами PHP-разработчика
PDF
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
PDF
Memcache message queue
PPTX
Redux и изоморфные приложения
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
Flex Data Access
Symfony as the platform for open source projects (sympal, apostrophe, diem)
Meet Magento Belarus - Alexander Kaigorodov
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
антон веснин Rails Application Servers
Как делать качественные PBN и следить за ними когда их более 1000
webpack: 7 бед - один ответ
"Доклад не про React", Антон Виноградов, MoscowJS 27
Sql server clr integration
Презентация «WebMarkupMin – HTML-минификатор для платформы .NET» с MskDotNet ...
Изоморфные react-приложения
Изоморфные React-приложения: производительность и масштабирование
Streaming media servers: FMS/Wowza
Фронтенд разработка без боли
Платформа .NET Core глазами PHP-разработчика
Эволюция клиентской разработки: от веба ко "всеобщей мобилизации” или mobile-...
Memcache message queue
Redux и изоморфные приложения
Ad

Viewers also liked (9)

PPTX
Php micro frameworks
PPTX
Yii Development
PDF
Debugging Drupal - How to Debug your Drupal Application
PPTX
Drupal 8 и хостинг
PDF
Если не Drupal 8, то что? Обзор Laravel 5
PDF
Headless Drupal на примере Drupal 8 и React
PDF
Why I Hate Drupal
PDF
Knowing Laravel 5 : The most popular PHP framework
PDF
Intro to Laravel PHP Framework
Php micro frameworks
Yii Development
Debugging Drupal - How to Debug your Drupal Application
Drupal 8 и хостинг
Если не Drupal 8, то что? Обзор Laravel 5
Headless Drupal на примере Drupal 8 и React
Why I Hate Drupal
Knowing Laravel 5 : The most popular PHP framework
Intro to Laravel PHP Framework
Ad

Similar to Phalcon - самый быстрый PHP Framework (20)

ODP
Nginx Igor Sysoev
PPT
Web весна 2013 лекция 1
PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
PDF
Компиляция скриптов PHP (Алексей Романенко)
PPTX
Стажировка-2013, разработчики, занятие 7. Web, HTTP
PDF
Компиляция скриптов PHP. Алексей Романенко
PPTX
Azure web apps - designing and debugging
PPTX
развертывание среды Rails (антон веснин, Locum Ru)
PPT
Воюем за ресурсы (ZFConf2011)
PPTX
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 6
PPT
PPT
Web sockets
PPT
Eugene Lisitsky Web Sockets
PDF
FT & HA Rails приложений приложений — это просто
PPTX
Cпецкурс 2014, занятие 7. Web-приложения
PPTX
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...
PPT
PDF
Истинный DevOps. Секрет 42.
PPT
Node.JS: возможности для РНР-разработчика
Nginx Igor Sysoev
Web весна 2013 лекция 1
Node.js введение в технологию, КПИ #ITmeetingKPI
Компиляция скриптов PHP (Алексей Романенко)
Стажировка-2013, разработчики, занятие 7. Web, HTTP
Компиляция скриптов PHP. Алексей Романенко
Azure web apps - designing and debugging
развертывание среды Rails (антон веснин, Locum Ru)
Воюем за ресурсы (ZFConf2011)
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 6
Web sockets
Eugene Lisitsky Web Sockets
FT & HA Rails приложений приложений — это просто
Cпецкурс 2014, занятие 7. Web-приложения
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...
Истинный DevOps. Секрет 42.
Node.JS: возможности для РНР-разработчика

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