Неделю назад передо мной стал вопрос выбора PHP-фреймворка для большого проекта, в котором будет очень много логики, сложная архитектура и потенциально большое количество посетителей. Основными критериями выбора (в порядке убывания важности) стали:
Большинство проектов наша команда разрабатывала с использованием Zend Framework. По моему, это очень хороший фреймворк, достаточно удобный и гибкий, с академически правильной архитектурой, огромным функционалом и большим сообществом. Но у него есть большие проблемы с производительностью — даже если в процессе оптимизации работающей системы свести на минимум использование компонентов фреймворка, то от «ядра» (MVC, бутстраппинг и т.д.) никуда не денешься. В работающей системе оно окажется ощутимым тормозом, ведь даже на простую страницу с «Hello World» Zend Framework 1.x делает больше 1500 вызовов функций и «отъедает» 2,5 МБ памяти на запрос. В Zend Framework 2.0 дела обстоят еще хуже (приблизительно в 2 раза).
Поэтому было решено использовать другой фреймворк. Он должен иметь намного большую производительность, чтобы этим самым аргументировать переход на него. Также желательно должен быть похожим и по возможности совместимый с Zend Framework (для использования его компонент в малонагруженных участках системы с целью ускорения разработки и упрощения поддержки).
Чтобы сравнить производительность именно «ядер» фреймворков, тестирование проводилось несколько раз на простых «Hello World» приложениях с отключенным кешированием.
Параметры тестовой машины (Lenovo V370):
Инструмент тестирования (Apache Benchmark):
Протестированные фреймворки:
Опытным путем выяснилось, что метрики полученные в процессе тестирования коррелируют между собой для каждого фреймворка. Поэтому, для простого сравнения производительности нет смысла собирать и анализировать все метрики, а достаточно одной. В нашем случае это — «requests per second» (rps) — количество обработанных запросов в секунду.
Чтобы определить верхний порог производительности тестовой машины, сначала я протестировал элементарную конструкцию:
Получилось ≈7500 rps.
Итак результаты тестирования фреймворков:
Ну и диаграмма для наглядности:
Лидером по производительности становится Yaf. Но он проигрывает фреймворку Phalcon, поскольку у него очень плохая документация (пишут китайцы) и меньший функционал. Даже тестовое приложение не с первого раза поднялось.
В процессе «ковыряния» и по итогам тестирования ближе всего стал именно Phalcon. Он написан на С как PHP extension, поэтому очень производительный. У него не плохой функционал — реализована MVC модель, ACL, кеширование, обертка над CLI, конфиги, ORM, dependency injection, event-driven архитектура, фильтры, flash сообщения, обертка над HTTP (request и response), autoloader, логирование, paginator, обертка над сессиями, генератор HTML тегов, многоязычность и т.д. К тому же, проект очень активно развивается на GitHub. Приложения c исользованием Phalcon по своей структуре очень напоминают проекты на Zend Framework. К тому же, у этих фреймворков в некоторой мере совместимое API, так что переход команды на Phalcon будет не сильно болезненным. В конце концов выбор остановился именно на этом фреймворке, так как он удовлетворяет все выше изложенные требования.
P.S. В своих рассуждениях я не претендую на абсолютную правоту, поэтому прошу аргументированно высказывать в комментариях ваши мнения на эту тему.
- производительность;
- функционал;
- гибкость и удобство разработки;
- документация и сообщество.
Постановка задачи
Большинство проектов наша команда разрабатывала с использованием Zend Framework. По моему, это очень хороший фреймворк, достаточно удобный и гибкий, с академически правильной архитектурой, огромным функционалом и большим сообществом. Но у него есть большие проблемы с производительностью — даже если в процессе оптимизации работающей системы свести на минимум использование компонентов фреймворка, то от «ядра» (MVC, бутстраппинг и т.д.) никуда не денешься. В работающей системе оно окажется ощутимым тормозом, ведь даже на простую страницу с «Hello World» Zend Framework 1.x делает больше 1500 вызовов функций и «отъедает» 2,5 МБ памяти на запрос. В Zend Framework 2.0 дела обстоят еще хуже (приблизительно в 2 раза).
Поэтому было решено использовать другой фреймворк. Он должен иметь намного большую производительность, чтобы этим самым аргументировать переход на него. Также желательно должен быть похожим и по возможности совместимый с Zend Framework (для использования его компонент в малонагруженных участках системы с целью ускорения разработки и упрощения поддержки).
Тестирование производительности
Чтобы сравнить производительность именно «ядер» фреймворков, тестирование проводилось несколько раз на простых «Hello World» приложениях с отключенным кешированием.
Параметры тестовой машины (Lenovo V370):
- Железо: Intel Core i3-2330M, 8GB DDR3, SSD SATA3;
- Софт: Ubuntu 12.04 LTS, Apache 2.2, PHP 5.3, все настройки дефолтные.
Инструмент тестирования (Apache Benchmark):
ab -n 1000 -c 5 http://test.dev/
Протестированные фреймворки:
- Zend Framework 2.0
Сайт: framework.zend.com
- CakePHP 2.2.2
Сайт: cakephp.org
- Symfony 2.1.1
Сайт: symfony.com
- Zend Framework 1.12
Сайт: framework.zend.com
- Silex
Сайт: silex.sensiolabs.org
- Laravel 3.2.7
Сайт: laravel.com
- Kohana 3.2.2
Сайт: kohanaframework.org
- Yii 1.1.12
Сайт: www.yiiframework.com
- FatFree 2.0.7
Сайт: bcosca.github.com/fatfree
- CodeIgniter 2.1.2
Сайт: codeigniter.com
- Phalcon 0.4.5
Сайт: phalconphp.com
- Yaf 2.1
Сайт: www.laruence.com/yaf
Опытным путем выяснилось, что метрики полученные в процессе тестирования коррелируют между собой для каждого фреймворка. Поэтому, для простого сравнения производительности нет смысла собирать и анализировать все метрики, а достаточно одной. В нашем случае это — «requests per second» (rps) — количество обработанных запросов в секунду.
Чтобы определить верхний порог производительности тестовой машины, сначала я протестировал элементарную конструкцию:
<?php echo 'Hello World!'; ?>
Получилось ≈7500 rps.
Итак результаты тестирования фреймворков:
Zend Framework 2.0 | 1 rps |
CakePHP 2.2.2 | 1 rps |
Symfony 2.1.1 | 54 rps |
Zend Framework 1.12 | 466 rps |
Silex | 494 rps |
Laravel 3.2.7 | 533 rps |
Kohana 3.2.2 | 885 rps |
Yii 1.1.12 | 894 rps |
FatFree 2.0.7 | 925 rps |
CodeIgniter 2.1.2 | 1226 rps |
Phalcon 0.4.5 | 2253 rps |
Yaf 2.1 | 2545 rps |
Ну и диаграмма для наглядности:
Итоги
Лидером по производительности становится Yaf. Но он проигрывает фреймворку Phalcon, поскольку у него очень плохая документация (пишут китайцы) и меньший функционал. Даже тестовое приложение не с первого раза поднялось.
В процессе «ковыряния» и по итогам тестирования ближе всего стал именно Phalcon. Он написан на С как PHP extension, поэтому очень производительный. У него не плохой функционал — реализована MVC модель, ACL, кеширование, обертка над CLI, конфиги, ORM, dependency injection, event-driven архитектура, фильтры, flash сообщения, обертка над HTTP (request и response), autoloader, логирование, paginator, обертка над сессиями, генератор HTML тегов, многоязычность и т.д. К тому же, проект очень активно развивается на GitHub. Приложения c исользованием Phalcon по своей структуре очень напоминают проекты на Zend Framework. К тому же, у этих фреймворков в некоторой мере совместимое API, так что переход команды на Phalcon будет не сильно болезненным. В конце концов выбор остановился именно на этом фреймворке, так как он удовлетворяет все выше изложенные требования.
P.S. В своих рассуждениях я не претендую на абсолютную правоту, поэтому прошу аргументированно высказывать в комментариях ваши мнения на эту тему.