Пишем свой фреймворк на php. Какой PHP-фреймворк выбрать для изучения

При разработке любого программного продукта перед командой разработчиков прежде всего стоит задача грамотного выбора программной платформы, определяющей структуру программной системы.

Для этого нужно учесть достаточно большое количество характеристик, от «как быстро всё будет работать» до «а необходима ли нам эта фича?». И так каждый раз. Именно в моменты мозгового штурма команда сравнивает удобство фреймворка, скорость, набор фич, которые реализованы в нем или в совместимых с ним модулях.

Но какой же всё-таки лучше, быстрее и производительнее?

Разработчики постоянно проводят сравнение фреймворков, чтобы прояснить для себя этот вопрос. Например, в статье Lukasz Kujawa приведено сравнение PHP фреймворков. Одно «но» - статья за 2013 год. А ведь время идёт… Поэтому мы решили провести своё, актуальное сравнение фреймворков.

Для оценки производительности был использован PHP Framework Benchmark . Он предлагает для сравнения множество фреймворков (не только указанных выше), но автор не спешит добавлять в репозиторий новые версии проектов, что, конечно же, печально, хотя и не смертельно. При желании добавить новую версию не сложно. 


Одной из основных целей данной статьи также является попытка практическим путем определить улучшения в производительности и эффективности новых версий PHP. Поэтому тестирование было проведено на РНР 5.6/7.0/7.1

Что будем сравнивать?

Для сравнения были выбраны следующие фреймворки:
  • slim-3.0
  • ci-3.0
  • lumen-5.1
  • yii-2.0
  • silex-1.3
  • fuel-1.8
  • phpixie-3.2
  • zf-2.5
  • zf-3.0
  • symfony-2.7
  • symfony-3.0
  • laravel-5.3
  • laravel-5.4
  • bluz (версия 7.0.0 - для РНР5.6 и версия 7.4 для РНР7.0 и выше)
  • ze-1.0
  • phalcon-3.0
Тестирование условно разделено на 4 вида:
  • производительность (throughput),
  • занимаемая память (memory),
  • время выполнения (exec time),
  • количество подключаемых файлов (included files).

Методика тестирования и тестовый стенд

Машина, на которой производилось тестирование, обладает следующими характеристиками:

Operation system: Linux Mint 17 Cinnamon 64-bit
Cinnamin Version 2.2.16
Linux Kernel: 3.13.0-24-generic
Processor: Intel Core i3-4160 CPU 3.60 Ghz X 2
Memory: 8 GB

Server version: Apache/2.4.7 (ubuntu)
Server build: Jul 15 2016
php 7.1 / php7.0 / php5.6

Вводим команду git clone https://github.com/kenjis/php-framework-benchmark - и фрейм уже на нашей машине. Поскольку мы использовали Mint, необходимо выполнить настройку: 


# Added
net.netfilter.nf_conntrack_max = 100000
net.nf_conntrack_max = 100000
net.ipv4.tcp_max_tw_buckets = 180000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10

Sudo sysctl -p

Немного о структуре самого php-framework-benchmark:

/benchmarks - содержит bash-скрипты, отвечающие за сбор информации о количестве запросов в секунду (при помощи утилиты ab), количестве информации, сколько времени было потрачено и сколько файлов вызывалось из файла «точки старта».

/lib - директория, в которой находятся файлы, отвечающие за обработку полученной информации после вывода страницы “Hello world”, вывод таблиц с результатами и построение диаграмм.

/output - директория, в которую добавляются логи после выполнения тестирования. Здесь находится по два файла для каждого протестированного файла: .ab.log - лог после работы утилиты ab, и.output - содержит информацию, которая была выведена на экран (обычно это hello world и данные по памяти, времени выполнения, использовавшимся файлам).

Остальные папки - это заготовки фреймов, в которые уже добавлен один контроллер, который вернет строку “hello world” при обращении по URI, составленному по правилам обращения к данному фреймворку.

Для запуска теста сначала нужно настроить фреймворки. Рассмотрим два подхода.

Команда bash setup.sh настроит те фремворки, которые описаны в файле list.sh. Вы можете его редактировать: добавлять и удалять папки для тестирования. То есть конфигурировать так, как вам необходимо.

Командой bash setup.sh fatfree-3.5/ slim-3.0/ lumen-5.1/ silex-1.3/ вы можете установить какие-то отдельные фреймворки, задав их параметрами к команде. В некоторых случаях это удобно, но мы использовали первый подход.

После произведенной настройки фреймворков, мы запустили тестирование при помощи bash benchmark.sh .

По окончании работы в терминале появилась таблица со списком протестированных фреймворков, количеством запросов в секунду, относительным значением, занимаемой памятью, а также относительными значениями этих показателей.

Для отображения графиков мы воспользовались ссылкой http://localhost/php-framework-benchmark/ .

Как вы понимаете, необходимо было произвести настройку Apache и заставить его смотреть в папку с фреймом. Всё это описано в readme, поэтому вопросов не возникает.

Результаты тестирования фреймворков

Каждый раздел имеет структуру, состоящую из двух форм представления результатов.

Первая форма - это наглядный тип представления. Каждая характеристика содержит 4 диаграммы. Каждая диаграмма отображает сравнение фреймворков между собой, плюс накопительная диаграмма. Она была построена при использовании определенной версии РНР. Таким образом можно проследить эволюцию улучшений в PHP и фреймворках.

Вторая форма - это результат тестирования в виде таблицы (хватить наглядности, давайте говорить серьезно - дайте мне больше чисел!).

Производительность (throughput)

Применительно к нашей ситуации, характеристика throughput измеряется в количестве запросов, которые наш фреймворк может обработать в течении секунды. Следовательно, чем выше это число, тем более производительно наше приложение, поскольку оно сможет корректно обрабатывать запросы большого количества пользователей.

Мы получили следующие результаты (запросы в секунду):

php 5.6 php 7.0 php 7.1
phalcon-3.1.2 5058.00 5130.00 7535.00
ci-3.0 2943.55 4116.31 4998.05
slim-3.0 2074.59 3143.94 3681.00
yii-2.0 1256.31 2276.37 2664.61
silex-1.3 1401.92 2263.90 2576.22
lumen-5.1 1316.46 2384.24 2741.81
ze-1.0 1181.14 1989.99 1741.81
phpixie-3.2 898.63 1677.15 1896.23
fuel-1.8 1044.77 1646.67 1770.13
bluz-7.3.1 - * 1774.00 1890.00
zf-2.5 198.66 623.71 739.12
zf-3.0 447.88 1012.57 1197.26
symfony-2.7 360.03 873.40 989.57
symfony-3.0 372.19 853.51 1022.28
laravel-5.3 258.62 346.25 625.99
laravel-5.4 219.82 413.49 600.42

Для наглядности построили графики для каждой версии PHP:

PHP5.6:

PHP7.0:

PHP7.1:



Занимаемая память (peak memory)

Эта характеристика (в мегабайтах) отвечает за количество занимаемой фреймворком памяти при выполнении поставленной перед ним задачи. Чем меньше данное число, тем лучше для нас и для сервера:
php 5.6 php 7.0 php 7.1
phalcon-3.1.2 0.27 0.38 0.37
ci-3.0 0.42 0.38 0.38
slim-3.0 0.61 0.55 0.55
yii-2.0 1.31 0.91 0.91
silex-1.3 0.74 0.65 0.65
lumen-5.1 0.80 0.63 0.63
ze-1.0 0.79 0.56 0.56
phpixie-3.2 1.22 0.82 0.82
fuel-1.8 0.7 0.6 0.6
bluz-7.3.1 - * 0.69 0.69
zf-2.5 3.06 1.34 1.34
zf-3.0 2.12 1.09 1.08
symfony-2.7 3.11 1.41 1.42
symfony-3.0 2.86 1.30 1.32
laravel-5.3 2.91 2.04 2.04
laravel-5.4 3.04 1.45 1.49

* - bluz-7.3.1 не поддерживает php 5.6

PHP 5.6:

PHP 7.0:

PHP 7.1:

Сводная накопительная диаграмма (по фреймворкам):

Время выполнения

Время выполнения - время, затрачиваемое системой для выполнения поставленной задачи. Измеряется от начала выполнения задачи до выдачи результата системой.

Мы рассмотрели, сколько запросов в секунду может обработать фреймворк, сколько памяти он при этом занимает. Теперь рассмотрим, сколько нам нужно ожидать, чтобы получить ответ от сервера. Чем ниже это значение, тем лучше для нас , да и для нервной системы клиента нашего приложения.

Время приведено в миллисекундах (ms):

php 5.6 php 7.0 php 7.1
phalcon-3.1.2 1.300 1.470 1.080
ci-3.0 0.996 0.818 1.007
slim-3.0 1.530 1.228 0.662
yii-2.0 1.478 1.410 1.639
silex-1.3 4.657 1.625 2.681
lumen-5.1 2.121 1.829 1.228
ze-1.0 2.629 2.069 1.528
phpixie-3.2 9.329 4.757 1.911
fuel-1.8 3.283 2.684 1.425
bluz-7.3.1 - * 1.619 1.921
zf-2.5 22.042 5.011 3.998
zf-3.0 12.680 2.506 2.989
symfony-2.7 6.529 3.902 2.384
symfony-3.0 9.335 3.987 2.820
laravel-5.3 19.885 4.840 2.622
laravel-5.4 19.561 4.758 3.940

PHP 5.6:

PHP 7.0:

PHP 7.1:

Сводная накопительная диаграмма (по фреймворкам):

Подключаемые файлы

Характеристика, отвечающая за количество подключаемых файлов, которые описаны в файле «точки входа» фреймворка. Понятно, что система тратит какое-то время на поиск и подключение. Следовательно, чем меньше файлов, тем быстрее будет осуществляться первый запуск приложения, так как обычно в последующие разы фреймворк работает с кэшем, что ускоряет работу:
phalcon-3.1.2 5
ci-3.0 26
slim-3.0 53
yii-2.0 46
silex-1.3 63
lumen-5.1 37
ze-1.0 68
phpixie-3.2 163
fuel-1.8 53
bluz-7.3.1 95
zf-2.5 222
zf-3.0 188
symfony-2.7 110
symfony-3.0 192
laravel-5.3 38
laravel-5.4 176


Разница в количестве подключаемых файлов между Laravel 5.3 и Laravel 5.4 может показаться странной и дать повод к обсуждениям, спорам и т.п. Спешим разъяснить ситуацию. Как вы знаете, с помощью команды

Php artisan optimize --force

В Laravel 5.3 можно сгенерировать файл compiled.php, и тем самым уменьшить количество подключаемых файлов, собрав их в один. Но есть одно «но»: команды для генерации этого файла в Laravel 5.4 больше нет. Разработчик решил удалить эту фичу, так как посчитал (https://github.com/laravel/framework/pull/17003), что для настройки производительности лучше использовать opcache.

Стоит ли обновляться?

Сводные данные по версиям более чем наглядно показывают, какой произойдет прирост производительности и эффективности использования ресурсов при переходе (или изначальном выборе) на новую версию PHP.

При переходе с PHP 5.6 на PHP 7.0 средний прирост производительности составил почти +90%, при этом минимальный прирост производительности составил +33% для Laravel 5.3, а максимум - >200% для Zend Framework 2.5.

Переход с версии 7.0 на 7.1 уже не так шокирует, но всё же в среднем даёт почти 20% прирост производительности.

Сведя все полученные данные по производительности различных версий PHP, получим вот такие «матрасы»:


Забавный факт : Laravel 5.3 показал наименьший прирост производительности при миграции с PHP 5.6 на PHP 7.0, но при этом наибольший прирост при миграции с версии 7.0 на версию 7.1, и как итог - производительность Laravel 5.3 и 5.4 на PHP 7.1 практически одинакова.

Потребление памяти тоже оптимизировали, так что переход с PHP 5.6 на PHP 7.0 позволит вашему приложению потреблять на 30% меньшем памяти.

Обновление с версии 7.0 до версии 7.1 практически не даёт прироста, а в последних Symfony и Laravel так и вовсе уходим в «минус», потому что они начинают чуть больше «кушать».


Осталось ещё посмотреть на время выполнения, и да, тут тоже всё отлично:

  • переезд с PHP 5.6 на PHP 7.0 подарит вам ускорение в среднем на 44%.
  • переезд с PHP 7.0 на PHP 7.1 подарит вам ускорение ещё на 14%.

Примечание. Тестирование при помощи ab - с чем мы столкнулись


«А что со slim и phpixie» - этот вопрос подтолкнул на расследование поведения утилиты ab при взаимодействии с этими фреймворками.

Выполним тест отдельно для Slim-3.0:

Ab -c 10 -t 3 http://localhost/php-framework-benchmark/slim-3.0/index.php/hello/index

Concurrency Level: 10
Time taken for tests: 5.005 seconds
Complete requests: 2
Failed requests: 0
Total transferred: 1800 bytes
HTML transferred: 330 bytes
Requests per second: 0.40 [#/sec] (mean)
Time per request: 25024.485 (mean)
Time per request: 2502.448 (mean, across all concurrent requests)
Transfer rate: 0.35 received

Что-то не так - количество запросов в секунду всего 0.4 (!)

Ab -c 10 -t 3 http://localhost/php-framework-benchmark/laravel-5.4/public/index.php/hello/index

Concurrency Level: 10
Time taken for tests: 3.004 seconds
Complete requests: 1961
Failed requests: 0
Total transferred: 1995682 bytes
HTML transferred: 66708 bytes
Requests per second: 652.86 [#/sec] (mean)
Time per request: 15.317 (mean)
Time per request: 1.532 (mean, across all concurrent requests)
Transfer rate: 648.83 received

Дело было в Keep Alive соединении, подробнее можно узнать тут.

“When you make requests with «Connection: keep-alive» the subsequent request to the server will use the same TCP connection. This is called HTTP persistent connection. This helps in reduction CPU load on server side and improves latency/response time.

If a request is made with «Connection: close» this indicates that once the request has been made the server needs to close the connection. And so for each request a new TCP connection will be established.

By default HTTP 1.1 client/server uses keep-alive where as HTTP 1.0 client/server don’t support keep-alive by default.”


Таким образом, тест для Slim должен выглядеть так:

Ab -H "Connection: close" -c 10 -t 3 http://localhost/php-framework-benchmark/slim-3.0/index.php/hello/index

Concurrency Level: 10
Time taken for tests: 3.000 seconds
Complete requests: 10709
Failed requests: 0
Total transferred: 2131091 bytes
HTML transferred: 353397 bytes
Requests per second: 3569.53 [#/sec] (mean)
Time per request: 2.801 (mean)
Time per request: 0.280 (mean, across all concurrent requests)
Transfer rate: 693.69 received

Заключение

Как и стоило ожидать безоговорочным лидером по производительности (но не скорости разработки) является Phalcon. Второе место, - а на самом деле первое среди PHP-фреймворков (а не C, на котором написан исходный код Phalcon) - занимает CodeIgniter 3!

Конечно же, не стоит забывать, что каждому инструменту своё предназначение. Если вы выбираете небольшой и легкий фреймворк и собираетесь написать на нём что-то отличное от простейших приложений или REST API, то, скорее всего, вы столкнётесь с проблемами при расширении функционала. И наоборот - избыточность полнофункциональных, больших фреймворков повлечёт за собой финансовые издержки на содержание хостинга даже для элементарных приложений под большой нагрузкой.

Это тестирование проводилось для того, чтобы убедить/рассказать/укрепить позицию языка РНР версий 7.0 и 7.1 в вашем сознании и в будущих проектах, донести информацию о том, что производительность действительно возросла.

Рефакторинг внутренних структур данных и добавление дополнительного этапа перед компиляцией кода в виде абстрактного синтаксического дерева - Abstract Syntax Tree (AST), - привели к превосходной производительности и более эффективному распределению памяти. Результаты сами по себе выглядят многообещающе: тесты, выполненные на реальных приложениях, показывают, что PHP 7 в среднем вдвое быстрее PHP 5.6, а также использует на 50% меньше памяти во время обработки запросов, что делает PHP 7 сильным соперником для компилятора HHVM JIT от Facebook.

Тесты полностью подтверждают и вдвое ускорившуюся обработку запроса в РНР7, и уменьшенное количество используемой памяти.

Выбор слишком велик, а выделить правильный фреймворк стало довольно проблематично. Как и у множества других разработчиков, ваш взгляд может пасть на популярные, проверенные и надежные фреймворки Bootstrap и Foundation. Однако новые, но не такие известные фреймворки могут намного больше подходить под ваши нужды. В таких условиях вам просто необходимо разобраться в самых популярных фреймворках на сегодня.

На что нужно смотреть при выборе front-end фреймворка

Перед поиском front-end фреймворка под ваш следующий проект очень важно ознакомиться с самыми крутыми функциями. Зная их, вы сможете намного быстрее взвешивать все плюсы и минусы самых популярных front-end фреймворков:

Ваш уровень – учитывайте уровень своих знаний при выборе front-end фреймворка. Если вы новичок, возможно, вам подойдет надежный фреймворк Bootstrap, в котором есть множество встроенных виджетов, и который потребует от вас минимальных навыков программирования. Если же вы более продвинутый разработчик, тогда вам подойдет более простой фреймворк, который даст вам больше пространства для кастомизации. Такие фреймворки компактнее и в них меньше кода, что будет только плюсом.

Адаптивный дизайн – любой разрабатываемый вами сайт должен хорошо отображаться на всех устройствах, так как все больше людей заходят в интернет через мобильные устройства. Сайт Similar Web выпустил отчет состояние мобильного интернета в США за 2015 год , в котором говорится, что 56 процентов потребителей трафика ведущих сайтов в США заходят в интернет с мобильных устройств. Ищите front-end фреймворки с поддержкой адаптивного дизайна, тогда у вас будет на одну проблему меньше.

Современные тенденции и подходы в веб-разработке

Узнайте алгоритм быстрого роста с нуля в сайтостроении

CSS препроцессоры – если вы используете CSS препроцессоры, к примеру, Sass или LESS, проверьте, чтобы они были совместимы с фреймворком.

Внешний вид – выбирайте тот фреймворк, с помощью которого вы можете добиться отличного внешнего вида с наименьшими усилиями.

Прототипы – идеальный front-end фреймворк позволяет быстро создавать вайрфреймы и прототипы для ускорения процесса дизайна и разработки.

И самое главное: хороший front-end фреймворк упрощает, модернизирует и ускоряет процесс дизайна и разработки сайта и в то же время обеспечивает вас гибкостью и функциональностью для создания уникального продукта.

Без лишних слов представляю вам восьмой по популярности front-end фреймворк в 2016 году.

Bootstrap

ТОП был бы неполным без очень популярного front-end фреймворка Bootstrap . Авторами фреймворка являются создатели Twitter, которые выпустили его в 2011 году. Самый используемый open-source фреймворк в мире.

Как и в любой другой эффективный front-end фреймворк, в Bootstrap входят компоненты HTML, CSS и JS. Фреймворк придерживается стандартов адаптивного веб-дизайна, позволяя вам создавать адаптивные сайты любой сложности и размеров.

Постоянные обновления Bootstrap гарантируют, что вы получите самые новые и лучшие функции. К примеру, почти сразу в фреймворк были добавлены темы, отвечающие стандартам material design от Google. Темы были улучшены для поддержки Sass.

поддержка адаптивного веб-дизайна (можно отключить по желанию);

обширная документация.

редко используемые стили увеличивают вес стандартного фреймворка до 276 Кб;

слишком много HTML классов и DOM элементов, что загрязняет код и путает пользователя.

Подходит для новичков и тех, кто предпочитает надежные front-end фреймворки.

нет заблокированных стилей, что дает вам больше гибкости;

вместо пикселей используются единицы измерения REM, что позволяет явно не задавать ширину, высоту и другие атрибуты под каждое устройство.

довольно большой вес файлов по умолчанию;

немного сложноват для новичков.

Подойдет разработчикам с приличным опытом, чья основная задача – быстрая разработка, привлекательные и адаптивные сайты.

Materialize

Фреймворк Pure создан командой разработчиков Yahoo. В комплекте идет легкий массив CSS модулей, которые подходят под любой проект. С Pure вы с легкость сможете создавать адаптивные кнопки, меню, сетки, таблицы и т.д. Фреймворк написан на чистом CSS и не поддерживает JS или JQuery плагины.

После минификации и сжатия через Gzip фреймворк Pure сжимается до 4.5Кб, что делает его одним из самых легких и проворных front-end фреймворков. Pure идеально подходит для мобильной разработки, из-за чего он приглянулся множеству разработчиков.

очень легкий, что обеспечивает быструю загрузку даже на мобильных устройствах;

гибкий массив CSS модулей можно использовать в абсолютно любом дизайне и проекте.

написан на CSS без поддержки JS или JQuery плагинов.

Подходит разработчикам, которые основной упор делают на создании адаптивных и быстрых мобильных сайтов.

Skeleton

Skeleton – легковесный адаптивный шаблон всего лишь из 400 строк кода. Фреймворк включает минимально необходимый функционал для старта разработки. В отличие от описанных выше фреймворков, это не комплексное решение.

Skeleton – адаптивный фреймворк, в основе которого лежит 12-ти колоночная сетка. В комплекте только необходимые элементы: кнопки, списки, таблицы, формы и т.д.

очень легкий;

простота и удобство для написания маленьких проектов.

отсутствие широкого выбора компонентов, в отличие от больших фреймворков.

Подходит тем, кто создает небольшие проекты, где не нужны все стилевые компоненты, которые можно найти в больших фреймворках.

UIKit

UIKit – высокомодульный front-end фреймворк, выделяющийся среди большинства по множеству причин. Главная причина – наличие двух препроцессоров, LESS и Sass.

Благодаря своим гибким и адаптивным компонентам с понятными именами, UIKit стал одним из самых популярных front-end фреймворков.

Еще большую универсальной фреймворку придают 30 модульных компонентов. Среди компонентов: меню, HTML формы и таблицы, JS компоненты, например, выезжающие вкладки и модальные окна, общие элементы, такие как кнопки, знаки и перекрывающие слои, а также компоненты макета, такие как жидкие, адаптивные системы сеток.

высокая кастомизация;

уникальная модульная структура, позволяющая добавлять компоненты к стилям, не оказывая влияния на общие стили;

возможность создавать сложные интерфейсы, благодаря компонентам наподобие вложенных списков.

фреймворк еще новый, в сети по нему очень мало ресурсов.

Подходит достаточно опытным разработчикам, так как на данный момент про фреймворк очень мало информации. Отлично подходит для создания как простых, так и сложных проектов.

Milligram

Milligram – еще один легковесный фреймворк, похожий на Skeleton. После сжатия через Gzip размер файла достигает 2Кб, что обеспечивает разработчикам простой и удобный старт.

Система сеток в Milligram отличается от большинства, так как она использует стандарт CSS Flexible Box Layout Module. Также в комплекте есть пара ключевых компонентов, которые помогут вам начать работу, среди которых шрифты, кнопки, формы, списки, таблицы, цитаты и т.д.

очень легкий, всего 2Кб после сжатия через Gzip;

использует систему сеток Flexbox.

фреймворк довольно новый, про него очень мало информации;

минимальное количество компонентов стилей по сравнению с более крупными фреймворками.

Подходит для разработчиков, создающих небольшие проекты, где не нужно много стилевых компонентов, а также для разработчиков, которые хотят использовать Flexbox.

Susy

Некоторые скажут, что Susy – не совсем front-end фреймворк, так как он решает сложные задачи по макетированию. По факту, множество людей расценивают Susy, как систему сеток, но она может стать незаменимым инструментом для людей, работающих с макетами.

Susy вооружает вас миксинами, с помощью которых можно создавать сетки. Фреймворк выполняет все вычисления за вас, что экономит много времени и сил.

Susy позволяет создавать сетки любой сложности. Если вы пытались решить проблему с созданием сложной системы сеток, вам поможет Susy.

повышенная гибкость позволяет создавать сетки любой сложности;

автоматические вычисления.

не покрывает все вопросы дизайна сайта, что потребует еще одного фреймворка;

нет встроенных сеток.

Подходит разработчикам с уникальными задачами по созданию макетов.

Статистика по front-end фреймворкам

Ваше решение не должно основываться на популярности фреймворка. Фреймворк необходимо выбирать, исходя из потребностей в разработке. И все же интересно, как расположатся все эти фреймворки в рейтинге. Список ниже показывает, сколько звезд получил каждый проект на GitGub на момент написания статьи (от самых популярных до менее популярных).

Bootstrap: 101,433 звезд

Semantic-UI: 28,170 звезд

Foundation: 24,127 звезд

Materialize: 21,515 звезд

Material UI: 19,631 звезд

Pure: 14,967 звезд

Skeleton: 12,622 звезд

UIKit: 7,433 звезд

Milligram: 4,195 звезд

Susy: 3,506 звезд

Кроме того, в сравнении ТОП-5 front-end фреймворков на Google Trends видно, что Bootstrap все еще на голову опережает своих конкурентов по числу упоминаний.

Заключение

Как видно, разные front-end фреймворки имеют свои преимущества. Что подходит одному разработчика или проекту, не подходит другому. Поэтому крайне важно провести анализ множества вариантов, прежде чем выбрать что-то конкретное.

Перед выбором front-end фреймворка определите свой уровень знаний, а также базовые требования вашего проекта. Скорее всего, один или несколько продуктов из списка идеально подойдут вам.

Вы знали, что 40% пользователей покидают сайты с плохим дизайном? Зачем терять прибыль? Выберите и установите прямо сейчас один из 44 тысяч премиум шаблонов для сайтов. Идеальный выбор для вашего бизнеса!

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

Все говорит о том, что язык PHP можно без проблем освоить быстро. Однако у этого преимущества есть и свои недостатки. Новички могут закрывать глаза на многие и нюансы и допускать ошибки в коде, поскольку они будут осваивать все довольно быстро и будут слишком уверены в своих знаниях. Чаще всего по мере добавления функционала на сайт код на выходе будет все сложнее и сложнее. Это потому что в PHP «из коробки» нет механизма, который бы помогал в разделении решения задач.

Давайте сейчас рассмотрим PHP-фреймворк, точнее 5 лучших из них, которые помогут справиться со многими проблемами при работе. Мы вкратце представим те, которые определенно стоит изучить в 2017 году, и расскажем, как именно они могут сделать разработку приложений проще. Поехали!

  1. Laravel

PHP-фреймворк существует уже довольно давно. Один из последних, новичок, – это Laravel. После выпуска 3-й версии его популярность кардинально повысилась, и на сегодняшний день это один из самых известных и распространенных фреймворков. У репозитория Laravel на GitHub рейтинг выше, чем у его более зрелых собратьев, таких как Symfony, CakePHP, CodeIgniter и Yii. О них речь пойдет позже.

Laravel повторно использует и монтирует существующие компоненты, предоставляя вам связующий слой, на базе которого вы можете более структурировано и практически создавать свои веб-приложения. Почерпнув самое лучшее из популярных фреймворков (не только на PHP, но и на других языках), Laravel предоставляет полноценный набор инструментов и архитектуру приложений, в которой собраны многие из лучших функций таких фреймворков, как CodeIgniter, Yii, ASP.NET MVC, Sinatra, Ruby on Rails и так далее.

Ниже представлен график, наглядно демонстрирующий рост популярности Laravel (источник – Google Trends). Максимальное значение (100) обозначает максимальную популярность технологии. Значение 50 говорит о том, что технология стала на 50% менее популярна, а значение 0 – о том, что популярность технологии снизилась до 1%. Все это актуально и для графиков популярности других фреймворков.

Рост популярности Laravel
(источник – Google Trends)

Большинство PHP-фреймворков используют парадигму разделения MVC (с англ. Model-View-Controller – Модель-Вид-Контроллер). Если вы когда-либо работали с одним из вышеупомянутых инструментов или знакомы с MVC, освоить Laravel 5 (самая последняя версия фреймворка) не составит труда.

  1. CodeIgniter

Как и Laravel, CodeIgniter основан на шаблоне MVC. Это такой подход к разработке ПО, который разделяет логику приложения от представления. На практике это позволяет снизить к минимуму количество сценариев на странице, поскольку представление отделено от выполнения сценариев на PHP.

CodeIgniter это великолепный и максимально простой PHP-фреймворк, разработанный для программистов, которые нуждаются в простом и доступном комплекте инструментов, чтобы создавать веб-приложения с полным набором функций.

Рост популярности CodeIgniter
(источник – Google Trends)

В комплект CodeIgniter включен простой обработчик шаблонов, основанный на принципе замены. Для большинства полнофункциональных механизмов обработки шаблонов доступны дополнения и плагины. Вы также можете использовать свои стандарты оформления кода и соглашения о присвоении имен, в которых есть лишь несколько предостережений, связанных с конфликтами имен класса. CodeIgniter призван развязать вам руки, а не ограничить вас.

  1. Symfony

В то время как многие другие фреймворки лишь следуют правилам MVC, Symfony это фреймворк, у которого MVC лежит в основе. Возможно, это одна из причин, по которым фреймворк Laravel и такая система управления контентом (CMS), как Phpbb, переняли у Symfony многие компоненты и стали идти по его стопам.

Стандарты Symfony позволяют проще обрабатывать ошибки и писать высококачественный код. С каждым годом его сообщество растет. Symfony это передовой PHP-фреймворк, в основе которого лежат компоненты. Он позволит вам создавать качественные сайты и веб-приложения.

Рост популярности Symfony
(источник – Google Trends)

Symfony 3 это набор изолированных и многоразово используемых компонентов, на базе которых в свое время были созданы PHP-приложения премиум класса, такие как Drupal и phpBB.

PHP-фреймворк – рассказываем о лучших из них в 2017 году

  1. Yii 2

Yii – это фреймворк обобщенного веб-программирования. Это значит, что он легко подходит для PHP-программирования для различных видов веб-приложений. Благодаря компонентной архитектуре и поддержке усовершенствованного кэширования он особенно хорош для создания крупномасштабных приложений. Например, вы сможете создавать порталы, форумы, интернет-магазины, системы управления контентом (CMS), веб-служб RESTful и так далее.

В Yii используется архитектурная модель MVC, поэтому и организация кода осуществляется на базе этого подхода.

Рост популярности Yii
(источник – Google Trends)

Yii 2 это комплексный PHP-фреймворк, который предоставляет большое количество заслуживающих доверия и готовых к работе функций. Среди них построители запросов и шаблон ActiveRecord для различных баз данных (в частности, реляционных и NoSQL), поддержка разработки веб-API RESTful, поддержка кэширования в несколько уровней и так далее.

  1. Nette

Фреймворк Nette – еще один уверенный игрок на рынке PHP-фреймворков для разработки веб-приложений, который заслуживает высочайшей оценки. Идет в комплекте с мощными функциями и упрощает жизнь веб-разработчиков. В нем используются усовершенствованные технологии, которые позволяют устранить слабые места в системе безопасности и противостоять различным видам атак типа межсайтового выполнения сценариев, межсайтовой подделки запросов, перехвата и фиксации сеанса.

Nette это современный PHP-фреймворк, который поддерживает такие технологии, как AJAX / AJAJ, внедрение зависимостей, KISS, MVC, SEO, cool URL и Web 2.0.

Рост популярности Nette
(источник – Google Trends)


Для начала скажу что я очень большой любитель что-то попатчить и потвикать, даже если для этого нету особой необходимости. И вот недавно рассматривая статистику XCache на своем сервере я подумал что смог бы оптимизировать объем памяти который он тратит на опкеш (opcache) файлов различных фреймворков. Сделать это просто - переписать все используя только один, файлы которого были бы общими для всех сайтов, каких у меня порядка 20-ти, но в большинстве они довольно простенькие и особого труда их переписать мне бы не предоставило. И тут я начал поиск того самого фреймворка, который в идеале имел бы достаточно фич чтобы разработка была простой, и в тоже время был легким и быстрым. Вот те которые мне понравились и мои мысли о них.


Интересный в первую очередь тем что написан на С и компилируется как модуль для PHP. Судя по бенчмаркам работает намного быстрее других (где-то в 3 раза быстрее среднего) и при этом соблюдая достаточно привычную MVC структуру. Так же очень порадовало то, что Phalcon использует Dependency Injection и предоставляет свой DI контейнер, но вот судя по туторилам всё равно очень часто классы используются напрямую, при этом включая статические методы, чего лично я стараюсь избегать. К слову должен сказать что модуль скомпилировался и заработал с первого раза, без танцев с бубнами, что всегда приятно. Посмотрев немного глубже я начал видеть больше недостатков, во-первых не так уж много PHP программистов которые достаточно хорошо знают С чтобы помочь в его разработке, как следствие Phalcon будет развиватся медленнее его PHP собратьев. Во-вторых, в нем придумано много своих костылей, как например PHQL (Phalcon Query Language) на замену SQL и т.д. В итоге имеем достаточно смелый проект с неизвестным будущем.

О нем я услышал совсем недавно, его упомянул в своем твите Phil Sturgeon (разработчик PyroCMS и член PHP-FIG) и я сначала подумал что это попросту шутка. Серьёзно, я считаю что ни один PHP программист не сможет прослушать интро на главной странице до конца при этом не рассмеявшись. Философия PHPixie в том что фреймворк должен быть быстрым и легким как маленькая фея , этого разработчики пытаются достичь подходом известным питонистам как «Simple things should be simple, hard things should be possible». То есть компоненты PHPixie написаны так чтобы самым простым и быстрым способом справится с 90% рутинных задач при разработке сайтов, а оставшиеся 10% сложных более редких задач предполагается разработчик решит сам и незачем их включать в сам фреймворк. Должен сказать что в ни одном из моих сайтов не использовалось ничего такого чего не было бы в PHPixie, и даже Dependency Injection у них довольно хорош, хотя и склоняется в сторону Service Locator. В отличии от других реализаций DI контейнеров новые элементы добавляются в него посредством расширения класса, что менее гибко, но намного более прозрачно, при этом позволяет полностью избежать процедурного кода и получить распознавание класса элементов контейнера в IDE. Из минусов могу только отметить то, что воспринимать его серьёзно достаточно трудно, и вряд ли вы сможете убедить ваших сотрудников в офисе писать что-либо на фреймворке с феями и пони.
Fat-Free

Весь фреймворк одним файлом! Огромный плюс сразу на лицо: один файл с диска подгрузится быстрее чем множество, причём размер этого файла примерно 50 килобайт. Правда как оказалось в этом одном файле далеко не весь фреймворк, а только самая основная его часть, то есть если вам например понадобится доступ к базе данных то классы все равно придётся подргружать.Тем более тот же XCache и так кеширует PHP код, в таком случае выигрыш от такого подхода если и будет то очень небольшой. Вместе с фреймворком поставляется просто куча библиотек, что удобно если не использовать Composer и совсем не нужно если использовать. Также очень удивило то, что их ORM не поддерживает связей между таблицами, без каких его можно сразу выбросить в окно, так как это очень сильно сужает область его использования. Это фактически единственный из рассмотренных мною фреймворков, который меня действительно в себе разочаровал.
Silex ,Slim и микрофреймворки.

Об этих двух известно и так достаточно много. Так как они оба не предоставляют полный стек для разработки тут все будет зависеть от того какие библиотеки вы к ним прикрутите и как это сделаете. Из этого исходит гибкость микрофреймворков, но с другой стороны труднее будет найти коммюнити и суппорт, так как у каждого программиста в итоге своя система. К тому же если фреймворк пишется весь одними людьми его намного проще освоить, так как философия кода похожа. А вот если у вас франкенштейн собранный из разных библиотек, в которых разный стиль и подход, то разобраться в этом будет сложнее. В конечном итоге попытки сделать из Silex полноценный фреймворк e у меня приводят к собранию некого подобия Symfony. Тут следует отметить что написания кода на Slim и Silex происходит интуитивно, быстро и безо всяких магий.

Тут немного больше инноваций, например единое API для SQL и NoSQL баз данных, а также по словам разработчиков децентрализованная система фильтров. Фреймворк создан бывшим разработчиком CakePHP, и местами это очень даже заметно, как например при использовании моделей. Фильтры позволяют фактически перехватить вызов метода класса и на лету поменять его параметры и результат. Гибко, но в итоге можно получить макаронный код, наподобие того как работают плагины в Wordpress. Так же удивительно что столь инновационный фреймворк так упорно использует статические методы. Радует простая архитектура, то есть если создавать простенький сайт то количество кода который придестя написать не намного отличается от использования Silex. В принципе очень хорошо подходит для тех кто работал с CakePHP в прошлом, но хочет попробовать что-то новое.

Так какой же я выбрал в итоге? В конце мой выбор стоял между Silex и PHPixie (да, я не устрашился фей) и в результате я все таки использовал их обеих. Большинство сайтов перевёл на Silex, а те которые писались на Kohana портировал на PHPixie, интерфейс которой чем-то к ней похож, особенно реализация ORM. Этим я смог уменьшить примерно в 6 раз количество памяти потребляемое XCache, ускорить генерацию страниц и даже успел немного порефакторить по дороге. В общем PHP - страна тысячи фреймоврков, так что думаю каждый сможет найти что-то по душе.

Введение

По ходу эксплуатации различных современных фреймворков я понял, что недостаточно понимаю, как все устроено внутри; не осознаю, почему разработчики выбрали то или иное решение; обращаю внимание только на текущую задачу и не смотрю «выше, глубже и дальше». И, как вариант для профессионального роста, я выбрал создание собственного проекта.

Как показала дальше практика: читать, знать, слышать о чем-либо, и уметь самому это реализовать - совершенно разные вещи. Теоретизировать можно бесконечно, но только настоящее практическое задание позволяет понять, на каком уровне ты находишься. Всвязи с этим и было начато «написание собственного велосипеда». Каким он получился - судить вам)

Процесс разработки

Разработка фреймворка велась следующим образом: изначально было некое простейшее веб-приложение, которое дорабатывалось, переписывалось, меняло структуру, обрастало новыми классами и компонентами и т. д. Несколько месяцев назад у меня появилось свободное время, много энтузиазма и решительности таки доделать фреймворк «по-серьезному». На написание данной версии я потратил в совокупности 3-4 недели (работая в среднем 1-3 часа в день, 3-4 дня в неделю).

По мере разработки стандарты и требования я сознательно завышал для себя, искал оптимальные решения много раз переписывал код. Так, например, работу с конфигурацией я переделывал раз 5-6 (причем несколько раз кардинально), роутинг - 3-4 раза. В качестве примеров я брал код из статей, публикаций, руководств, фреймворков (Yii2, CodeIgniter, Zend, Phalcon, Bun) и т. п.

Анализ требований

Все начинается с анализа требований и пожеланий к итоговой системе.

Фреймворк должен:

  • позволять быстро создать сайт «с нуля»
  • иметь в себе ряд уже реализованных базовых технических решений и инструментов
  • содержать разделенный frontend и backend
  • отвечать современным требования по коду, технологиям, применяемым техническим решениям и т.п.
  • содержать уже в базовой комплектации демо-приложение, на основе которого можно вести свою разработку
  • быть модульным и расширяемым
  • иметь понятную документацию, техподдержку (в идеале - сообщество)

Применяемые технологии

Список таких решений напрямую зависит от того, о чём знаете и что применяете в своей реальной практике. Т.е. подходим к необходимости постоянного мониторинга новинок и изменений в сфере ИТ.

Практики и технологии:

Структура папок

Приведу структуру файлов и папок в фреймворке (также можно посмотреть код на GitHub):

Код

В приложении есть одна единственная точка входа . Привожу код файла index.php из корневой публичной папки веб-сервера.

Session_start(); $loader = require(__DIR__ . "/../../vendor/autoload.php"); $loader->addPsr4("framework\", __DIR__ . "/../../system/"); $loader->addPsr4("frontend\", __DIR__ . "/../"); $loader->addPsr4("common\", __DIR__ . "/../../common/"); $config = array_merge(require(__DIR__ . "/../config/main.php"), require(__DIR__ . "/../../common/config/main.php")); $appication = new frameworkcoreApplication(); $appication->run($config);

Код метода run($config) из класса frameworkcoreApplication() . Производится загрузка необходимых классов приложения и производится вызов соответствующего контроллера (в методе execute() ).

/** * * @param array $config */ public function run($config = ) { $this->benchmark = new Benchmark(); $this->environment = Environment::get(); $this->config = new Registry($config); $this->response = new Response(); $this->request = Request::getInstance(); $this->assets = new Asset($this->config->assets); $this->setParams(); $this->router = new Router($this->config->routes); $this->execute(); }

Код метода execute() из класса frameworkcoreApplication() . Нужный контроллер на данном этапе уже выбран, производим инициализацию этого контроллера, обработку хеадеров, вывод контента. В случае ошибки - бросаем 404 Not Found .

Public function execute() { $controllerName = $this->router->getControllerName(); try { $controllerClass = "\" . $this->config->name . "controllers\" . $controllerName . "Controller"; if (class_exists($controllerClass)) { $controller = new $controllerClass; if ($controller instanceof Controller) { $controller->setApplication($this)->run(); } } else { throw new CoreException("Controller "" . $controllerName . "" not exists: " . Request::getInstance()->server["REQUEST_URI"]); } } catch (CoreException $e) { $e->logError(); $this->response->setHeader("HTTP/1.1 404 Not Found"); $this->router->error404(); $this->execute(); exit(); } foreach ($this->response->getHeaders() as $header) { header($header); } echo $this->response->getContent(); }

Улучшения и планы на будущее

В качестве адаптера для коннекта к БД я использовал PDO . В ходе работы PDO мне не очень понравился - сложно отлаживать запросы, хочется комфорта использования ORM. Можно установить Eloquent ORM - это современное и готовое решение (применяется в фреймворке Laravel), да и к тому же оно хорошо документировано и может быть установлено из composer за несколько минут.

Так же думал о расширении базового функционала фреймворка: хотел добавить поддержку модулей. Т.е. чтобы можно было написать например, блог как отдельный модуль (со своими контроллерами, вьюверами, моделями и т.п.). И потом подключать этот модуль в любом месте приложения.

Можно расширять и базовый «джентельменский» набор классов в ядре, усложнять систему логирования, обработки ошибок, конфигурирования, писать полноценный демо-сайт со всем функционалом и т.д.

Заключение

Буду рад услышать критику кода, архитектуры, изначальных требований и прочего. Комментарии буду активно читать, постараюсь ответить на вопросы.

Так же хотелось бы реализовать какой-либо проект на базе данного фреймворка. Так сказать опробовать инструмент в работе. Понятно, что поиск заказчиков - это совсем не к данному разделу, но хотел бы услышать, можно ли на данном решении стартовать реальный проект? Популярные фреймворки «из коробки» дают функционал в 50-100 раз качественнее и масштабнее, конкурировать с ними сложно.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: