Порівняння швидкодії PHP-фреймворків



Недавно переді мною постало питання вибору PHP-фреймворку для великого проекту, в якому буде дуже багато логіки, складна архітектура і потенційно величезна кількість відвідувачів. Основними критеріями вибору стали: продуктивність, функціонал, гнучкість, зручність розробки, документація та спільнота. Отож, який із сучасних PHP-фреймворків варто обрати?

Постановка завдання

Більшість проектів наша команда розробляла з використанням Zend Framework. Як на мене, то це дуже хороший фреймворк, досить зручний і гнучкий, з академічно правильною архітектурою, величезним функціоналом і спільнотою. Але у нього є великі проблеми з продуктивністю — навіть якщо в процесі оптимізації працюючої системи звести на мінімум використання його компонентів, то від «ядра» (MVC, бутстраппінг і т.д.) нікуди не дінешся. У сильно навантаженій системі це буде дуже відчутно, адже навіть на просту сторінку з «Hello World» Zend Framework 1.x робить більше 1500 викликів функцій і «від’їдає» 2,5 МБ пам’яті на один запит. У Zend Framework 2.0 справи йдуть ще гірше (приблизно в 2 рази). Тому було вирішено використовувати інший фреймворк. Він повинен мати набагато більшу продуктивність, щоб цим самим аргументувати перехід на нього.

Тестування продуктивності

Щоб порівняти продуктивність саме «ядер» фреймворків, тестування проводилося кілька разів на простих «Hello World» додатках з відключеним кешуванням. Параметри тестової машини:
  • Залізо: 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 тегів, багатомовність і т.д. До того ж, проект дуже активно розвивається.

Додатки написані з використанням Phalcon за своєю структурою дуже нагадують проекти на Zend Framework, так що перехід команди на Phalcon буде не сильно болючим. Зрештою вибір зупинився саме на цьому фреймворку, так як він задовольняє всі вище викладені вимоги.

Коментарі

Популярні дописи з цього блогу

Колір в CSS

Комунікація між вкладками браузера