И снова извечный вопрос выбора. В наше героическое время PHP-фреймворков – хоть жопой жуй. В планах реализация нового проекта (точнее, первый этап – реализация движка для нескольких новых проектов), соответственно в который раз встает вопрос выбора.
Фреймворки рассматриваются с разных позиций, а именно:
- Легкость создания нового проекта, чтения и поиска документации
- Продуманность объектной модели, возможность расширения
- Потребление памяти
- Скорость
- Роутинг
- Удобство настройки и отладки
Тесты производились на неком “Hello world”-проекте, типичном для MVC фрейморков. Проект включает в себя 1 контроллер, 1 модель, 1 представление, 1 роут. Модель загружается из базы средствами ORM. Поскольку во всех фреймворках скорость выполнения тестового проекта высока, для оценки использовались результаты apache benchmark (ab) на loopback-интерфейсе (127.0.0.1).
Для тестов использовался VDS (1 Гб памяти, бёрст до 1.5 Гб). Процессор: по 666 Мгц от каждого из 4х ядер “старого” Xeon X3350.
Настройки всех фреймворков “по умолчанию”. Для KO3 включен caching (это не кэширование запросов, это кэширование путей для автозагрузки классов. Ближайший аналог, наверное, prod режим в Symfony2). Для Symfony2 включен prod режим, отключен дебаг.
Пост писался 5 июля 2010, но так и не увидел свет в день своего рождения. Публикую спустя месяц.
Результаты:
Вот сюрприз! Обычно их помещают в самый конец статьи, но… не всем интересны рассуждения и прочее. Так что пусть побудут здесь.
Параметр | Yii 1.1.2 | Kohana 3 (git) | CI 1.7.2 | OnPHP (git) | Symfony2 (git) |
Легкость создания | 5 | 5 | 4 | 2 | 3 |
Объектная модель | 5- | 5- | 3- | 5- | 5- |
Память | 4718592 | 2359296 | 3407872 | 3145728 | 6029312 |
Скорость | 5 | 5 | 5- | 4 | 4- |
Роутинг | 5 | 5- | 5- | 3 | 5 |
Удобство | 5 | 4 | 4 | 3 | 4 |
Об эксперименте
Условия эксперимента: фактически, в последнее время мне пришлось сталкиваться лишь с KO3 и Symfony2. Ну, и с древним CodeIgniter еще. Symfony2 – отличный фреймворк, который и меня удивил самым худшим результатом по многим параметрам. У Фабьена, автора Symfony2, есть иное мнение насчет производительности и потребления памяти. Что ж, возможно, я все неправильно настроил. Итак, небольшая расшифровка:
Yii
Я ненавижу этот фреймворк! Всей душой ненавижу за первую буковку C в имени каждого класса! Однако, создание нового проекта оказалось делом совсем несложным. Несмотря на отсутствие готового “проекта-скелета”, я в течение получаса из кусочков примеров создал работоспособное приложение. В плане объектной модели – очень понравилась реализация ORM. Во-первых, пользователю даётся возможность писать свой SQL код (сравните с многочисленными –>and_where()->or_where() в KO3). Во-вторых, если я верно читаю код - выгрузка из БД работает более эффективно, и на больших объемах записей это может стать заметно.
Объектная модель замечательная. Более того, статический анализ кода в IDEA не ошибается с типами объектов. Не понравилась только необходимость в каждом классе-потомке CActiveRecord задавать статический метод model. К тому же, одинаковый для всех моделей. Но есть и плюс: статический анализ типов в IDE правильно определит тип результирующего объекта.
Потребление памяти больше, чем у KO3 и CI 1.7.2. На самом деле, я именно по этой причине не работал с Yii. Однако, видимо, с недавних пор всё стало лучше. Может быть, все лучшее – еще впереди (Yii – очень молодой фреймворк, самый молодой из всех здесь описанных – ну, если считать, что Symfony2 это развитие Symfony, а KO3 – развитие Kohana 2. Yii увидел свет в октябре 2008). Точно помню, что один из примеров Yii, демонстрирующий работу блога, “кушал” более 10 Мбайт памяти. Для сравнения: написанная совместно с коллегой поделка на Kohana 3 (блог, работающий с БД от WordPress), “отжирала” лишь около 5 Мбайт.
Kohana 3 (KO3)
Я всей душой люблю этот фреймворк! Отчасти – за его простоту, отчасти – за богатую функциональность, отчасти – за огромное живое коммьюнити. Да, у него есть много недостатков и еще в разы больше достоинств. Впрочем, в этом обзоре KO3 занимает лишь второе место. В этом движке есть практически все. Скорость работы (ну, пожалуй, кроме БД) и особенно потребление памяти впечатляют! И это лишь стандартная поставка (видел еще хак с пре-кэшированием наиболее часто использующихся классов – ну, примерно как в Symfony2).
Плюсом и минусом фреймворка является “каскадная” файловая система. Каждый файл ищется и в application/, и в modules/, и в system/. Поэтому, при запуске тестов было включено кэширование путей. С отключенным кэшированием система довольно заметно “сдаёт”. На реальных приложениях, прирост скорости засчет включения кэширования путей может составить до 100%.
Из-за пресловутой отсутствующей строчки (см. выше), модели для ORM писать легко и приятно. Впрочем, для нормальной работы статического анализатора типов, можно поступить так же, как поступают в Yii :-).
Несмотря на обилие модулей, хелперов и всего остального, меня все не покидает ощущение “незавершенности”. Все чего-то не хватает. Может, это просто мнение “джависта”, у которого во фреймворке больше объектов и функций, чем когда-то может понадобиться человеку. Однако, с Yii такого ощущения не возникало.
CodeIgniter
Здравствуй-здравствуй, старый тормозной отсталый друг! Чтобы придумать достойную причину тебя использовать, люди в Интернете даже вспомнили про твою совершенно нечитаемую документацию… А еще есть даже видео-туториалы!!! В общем, смотрите куда угодно, только не на код!
Ущербное наследование – что может быть страшнее типов вроде MY_Controller. Но, с другой стороны, он много лучше, чем CakePHP. Ладно, не будем смеяться над трупом. Тем более, что труп – все еще очень быстр и почти так же легковесен, как Kohana. Впрочем, даже и код уже разгребли, кажется. В общем, товарищи работают над фреймворком небыстро, но хорошо.
В любом случае, после того, как CI неминуемо лишится поддержки PHP4, и нормально заработает с акселераторами – думаю, он, возможно, всем еще покажет. Но для меня он умер.
Symfony 2
Для меня – разочарование разочарований. Описание и возможности – прекрасны. Но текущая стадия реализации, неудобство в использовании и прочие мелочи на данный момент просто не дают использовать его в продакшен целях. Через годик будет просто восхитительный фреймворк, надеюсь.
OnPHP
Для меня – просто открытие. Несмотря на огромный порог вхождения, на сложности, связанные с созданием проекта и настройкой роутинга, этот фреймворк заслуживает отдельного внимания. Почему? Я даже не знаю, как это лучше объяснить. Впрочем, попробую. Я видел код этих ребят. И нет, у них не написано, что они дадут стопицотбаксов за положительный отзыв. Просто у них отличный архитектор (хотя объектная модель и слизана с Java фреймворков). Например, абсолютно прозрачно для программиста можно включить кэширование для базы – сайт легко адаптировать под повышенную загрузку. Не самые высокие результаты бенчмарка – тоже довольно легко объяснить: решение для MySQL явно всего лишь костыль.
Одним словом, несмотря на низкие оценки, поставленные фреймворку, он реально хорош. Середнячок по скорости (несмотря на огромное количество абстракций и подключаемых дополнительных фич), второй результат по потреблению памяти (что свидетельствует об оптимальной объектной модели – фреймворк не загружает слишком много классов). Вопросы удобства создания проекта – для успешного завершения не главное. Серьезный минус – лишь отсутствие документации.