Тестирование производительности PHP-фреймворков

Неделю назад передо мной стал вопрос выбора PHP-фреймворка для большого проекта, в котором будет очень много логики, сложная архитектура и потенциально большое количество посетителей. Основными критериями выбора (в порядке убывания важности) стали:
  • производительность;
  • функционал;
  • гибкость и удобство разработки;
  • документация и сообщество.

Постановка задачи


​Большинство проектов наша команда разрабатывала с использованием 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/

Протестированные фреймворки:

Опытным путем выяснилось, что метрики полученные в процессе тестирования коррелируют между собой для каждого фреймворка. Поэтому, для простого сравнения производительности нет смысла собирать и анализировать все метрики, а достаточно одной. В нашем случае это — «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. В своих рассуждениях я не претендую на абсолютную правоту, поэтому прошу аргументированно высказывать в комментариях ваши мнения на эту тему.
Теги:
php, фреймворки, производительность, выбор, benchmark

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.