Наверх ▲

Микрофреймворки на PHP

Андрей Синицын Андрей Синицын Архитектор в Ratengoods.com
Более 10 лет опыта разработки, пять из них - высокие нагрузки. Особую любовь питаю к обработке и анализу данных

Андрей Синицын: Всем добрый день! Меня зовут Андрей Синицын. Я работаю в компании "Ontico". Расскажу вам про такую набирающую популярность вещь, как микрофреймворки на PHP.

Давайте сначала определим предметную область: о чем будем общаться? Микрофреймворк – это "каркас" приложения, включающий в себя какие-то роутеры и типовые задачи, которые уже решены. Ключевая часть слова здесь – "микро". Очень облегченный, очень маленький, очень быстрый продукт (не знаю, как назвать).

Что внутри?

Внутри есть, как правило, роутер, который определяет URL, базовая реализация MVC, модели, контроллеры, обработки HTTP-запросов, обработка ошибок. Это самый минимум, который необходим, чтобы быстро запустить приложение.

Как все это появлялось. Честно говоря, я познакомился с микрофреймворком не на примере PHP. Я увидел на Python: bottle.py. Очень понравилась сама идея – один файл, все очень здорово. Я решил покопать  дальше и нашел, что на многих языках это реализовано.

Как это было изначально. Когда появилась потребность в редактировании контента (нужно было работать с интернетом людям, которые не очень умели это делать), придумали CMS.

Большие монолитные тяжелые гробы, которые плохо кастомизировались, честно говоря, несмотря на все старания их разработчиков. Пытались расширить функциональность плагинами, но опытный человек все равно сразу увидит любую CMS-ку по сетке, по формату URL. Очень много способов определить, на чем конкретно сделан данный сайт.

Получалось очень много одинаковых вещей. Не хватало функциональности. Дальше у нас появились фреймворки, которые не навязывали разработчику свою структуру – решали типовые задачи. Огромное количество типовых задач закрыто во фреймворке, чтобы у разработчика не болела голова о том, что ему надо обрабатывать формы, следить за запросом, как-то cookie…

"Все включено". Сделали хорошую вещь по принципу "все включено". Отлично кастомизируется, но достаточно большой объем кода и требует более высокой квалификации, нежели накидать сайтик на WordPress или магазинчик на Joomla поднять.

В этот момент появились микрофреймворки.

Маленький и быстрый. Ключевая особенность – это именно маленький и быстрый. Нет ничего лишнего. Он очень быстро работает, очень хорошо выглядит для разработчика. Отлично интегрируются сторонние компоненты туда: он набивается по принципу конструктора. Туда набивается все, что необходимо, и быстро запускается.

Не требует длительного изучения и погружения в код, чтобы просто написать приложение.

Как это использовать?

Например, у нас есть хорошая соседка – кавайная няшечка, которую давно хочется пригласить в кафе. Она приходит и говорит: "Знаешь, я вот хочу открыть магазин по продаже вышитых мной платочков". Конечно, отличный повод познакомиться с девочкой!

Садишься за комп и в этот момент понимаешь, что WordPress – это не кошерно. Мы же крутые ребята, в принципе-то. Брать какой-нибудь Zend Framework, чтобы сделать ей три странички, тоже не хочется. Собственно говоря, чтобы не писать ничего с нуля, можно взять любой из микрофреймворков.

Если серьезно, то это уникальная, по моему мнению, возможность, чтобы создавать быстрее прототипы. Как правило, при разработке больших сложных систем очень многие узлы должны быть показаны заказчику перед тем, как начнется их разработка. Уже много про это говорили вчера и сегодня: понимания между заказчиком и разработчиком никогда нет и не будет.

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

Особенности микрофреймворков

В них нет избыточности. Люди, которые их разрабатывают, взяли и положили туда именно то, что необходимо.

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

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

Есть такая особенность, что многие микрофреймворки требуют определенной версии PHP. Как правило, это больше 5.3, потому что там активно используется кодогенерация, пространства имен для разделения компонентов. PHP ранних версий в зачаточном состоянии. Какие-то анонимные функции, по-моему, в 4-й версии были – уровня create_function. Что-то такое.

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

Комплектация 

Роутинг URL. Красивые URL необходимы сейчас, по-моему, всем. Давно уже никто не любит кучу GET-параметров в адресной строке. Все хотят видеть маленькие хорошие понятные URL. Красивые!

Обработчик запроса. Мы хотим брать GET, POST, cookies. Мы хотим видеть это все в объектах. Мы хотим работать с этим удобно.

Базовые компоненты MVC. MVC-концепт уже настолько прочно вжился в веб, хотя не для веба изначально разрабатывался. Удачно прилепился. Как правило, микрофреймворк предоставляет базовые реализации моделей, базовые реализации контроллеров, хотя многое остается на совести обработчика.

Обработка ошибок нормальная хорошая – с exception. Преобразованы в exception все PHP нотисы.

Своя страница ошибок. Ошибка 404, 403.

Схема кэширования. Некоторые фреймворки не поддерживают этого, а в некоторых уже есть что-то такое, что умеет кэшировать.

Я дальше буду рассказывать о конкретных продуктах. Для этого доклада я сделал тест: взял фреймворк, которого никогда не видел. Это Fat-Free (я о нем буду говорить). Почитал документацию – простейшее приложение.

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

Расширение

Чем хороши микрофреймворки. Они расширяются сторонними компонентами. Причем фактически любыми сторонними компонентами. Хотите ORM, TPL Engine какой-то свой, сетевые коммуникации, подключить API для платежных систем, REST/SOAP, подключить свое кэширование (его самого куда-то встроить).

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

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

Slim Framework

Все знают его – по-моему, он известный. В Google при запросе "PHP микрофреймворк" он вылезает первым. Хороший, удобный, быстрый. Подключается одним файлом. Сразу позволяет определить роутинг, контроллеры для запроса и вывести необходимую информацию на страницу.


Silex

Silex основан на Symfony. Очень хорошее решение. Взяли большой взрослый фреймворк, убрали оттуда все лишнее, оставили возможность интеграции с компонентами Symfony. Что-то, по-моему, даже осталось в нем самом. Получилась очень маленькая и удобная вещь.

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

Flourish + Moor.

Это не то чтобы фреймворк. Получилась очень удобная хорошая сборка. Сам Flourish – это библиотека, которая содержит в себе все необходимые (не знаю, как назвать) низкоуровневые, может быть, функции. Но она никак не может работать ни с запросами, ни с чем. Она обрабатывает ошибки, имеет драйверы для баз данных, базовые контроллеры (модель MVC).

Moor – это исключительно роутер. Хороший и удобный, быстрый роутер.

Это все вместе совмещается очень просто. Интегрируется друг в друга. Получается вот такая вещь.


Fat-Free

Собственно говоря, на нем я и писал блог. 55 килобайт кода, 2 файла, по-моему. Работает очень быстро. Очень понятен. Несмотря на довольно-таки фиговатую документацию, честно говоря, продукт весьма хорошо и удачен.

Собственно, все. Вопросы.

Вопросы и Ответы

Реплика из зала: Здравствуйте! Раз такой короткий доклад, тогда и вопрос короткий. Из чего состояло 20-тиминутное написание блога?

Андрей Синицын: В смысле "из чего"?

Реплика из зала: Какие процедуры вы выполнили, прежде чем блог заработал? Может быть, верстали что-то.

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

Реплика из зала: Ничего не понятно!

Андрей Синицын: Почему? Может, пояснить? Что конкретно не понятно.

Реплика из зала: Не понятно, из чего, собственно, состоял этот процесс. Какой функционал включает в себя этот фреймворк? Мы же должны отобразить веб-страничку, правильно. Наверняка это все не из каких-то preset-ов создается, а делается на каком-то этапе вручную. Из чего состояли ручные операции, которые вы делали?

Андрей Синицын: Ручные операции – это написание конкретных контроллеров и моделей под конкретные задачи. Есть базовая модель и базовый контроллер, которые содержат в себе абстрактные методы (какие-то action абстрактные). Они переопределяются в дальнейшем коде и работают.

Мне нужно было добавить пост, мне нужно было отобразить его, добавить комментарий. Все это я писал руками. Url-ы, ошибки, база данных – все это было уже готово. За это у меня голова не болела.

Нормально, понятно объяснил?

Реплика из зала: Здравствуйте, Андрей!    

Андрей Синицын: Добрый день.

Реплика из зала: Меня Максим зовут. Вы очень мало рассказали про расширения этого микрофреймворка до полноценного функционала.

Андрей Синицын: А что имеется ввиду под полноценным функционалом?

Реплика из зала: Смотрите, у нас микроядро, которое умеет всего лишь создавать url-ы, коннектиться к базе, парсить HTML. Мы хотим, к примеру, взять микрофреймворк Symfony и апгрейднуть его до всех возможностей Symfony. Или, скажем, будет выдержка из Django – микрофреймворк мы хотим апгрейднуть до Django. Это просто примеры.

Как микрофреймворк потом расширяется до полноценного функционала?

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

Если брать для примера Silex, мы берем что-то из Symfony, что там есть – конкретные вещи, которые нам нужны. Нам, например, могут быть не нужны сессии, нам может быть не нужна авторизация. Мы это не берем. Берем только то, что нужно. Есть механизм интеграции, который описан в документации.

Реплика из зала: Это я понимаю. Но ведь как всегда происходит в нашем мире: сейчас нужно одно, а через месяц – "давайте накрутим это, давайте накрутим это, давайте сделаем так".

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

Реплика из зала: Микрофреймворк нельзя считать началом чего-то большого?

Андрей Синицын: Можно, но нецелесообразно, мне кажется. Больше труда будет вложено, нежели  изначально взять полноценное приложение.

Реплика из зала: Хорошо, спасибо.

Реплика из зала: Как в микрофреймворках работать с формами?  Или они не поддерживают такие вещи.

Андрей Синицын: Как правило, да – это не заложено туда.

Реплика из зала: Только выводка? А как делать блог и как заполнять…

Андрей Синицын: Можно подключить сторонние валидаторы. Есть библиотеки для обработки форм – уже готовые, уже написанные. Их можно просто интегрировать туда, если они нужны. Фишка в том, что это конструктор: собирается только то, что нужно. Все остальное остается за кадром.

Реплика из зала: Понятно. Все остальные компоненты вы собираете сами?

Андрей Синицын: Да. За счет этого, кстати, работает очень быстро. Нет избыточности. Быстрые приложения получаются. Ключевые моменты в больших системах имеет смысл писать именно на микрофреймворках.

Реплика из зала: Спасибо.

Андрей Синицын: Еще вопросы.

Реплика из зала: Здравствуйте!

Андрей Синицын: Добрый день.

Реплика из зала: Владимир Воронин. Вы говорили о том, чтобы быстро что-то показать клиенту. Существует куча готовых CMS так называемых. На них показать посты, страничку можно вообще за 10 минут.

Целесообразность применения именно… Я не говорю о высоконагруженных. Да, быстрота, действительно, а вот именно что-то быстрое показать. Все равно это дело переделывать потом: делать по-человечески, по-нормальному. Какую-то взять CMS или что-то еще.

Андрей Синицын: Тут ключевой момент в том, что прототипы каких-то узлов. Возможно, клиент хочет посмотреть, как будет реализован какой-то нестандартный функционал.

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

Реплика из зала: Спасибо.

Андрей Синицын: CMS в данном случае не подойдут, потому что они предлагают какие-то куски. Не более того.

Большое спасибо.

Комментарии

0
# 18 августа 2014 10:27
Вот один из новых микрофреймворков, ещё сырой, но это из-за версии 0.3 http://rumba.net.ru/new-micro-framework-php-rumba.html
0
# 22 августа 2014 11:50
Посмотрел Румбу, у неё есть одна важная перспективная фишка - она из семейства движков, заточенных под xml. Надо будет зарегиться на форуме румбы и поспрашивать автора. Кстати, и ещё один плюс - русскоязычная поддержка ( ну не лежит у меня душа к чтению инструкция на инглише 8-) , хотя коворила мама, учи сынок английский.

Только пользователи могут оставлять комментарии

Возможно, вам будет интересно:

Эсен Сагынов (Esen Sagynov)

Эсен Сагынов (Esen Sagynov)

Разработчик в NHN - крупнейшей IT-компании Южной Кореи.

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

Дмитрий Шатров

Дмитрий Шатров

Разработчик сервисов "Трансляции" и "Видеочат" в @Mail.Ru.

Разработчик серверной части сервисов трансляции и видеочата в Mail.Ru и автор видеосервера Moment предлагает поговорить об оптимизации сервера потокового видеовещания.

Борис Вольфсон

Борис Вольфсон

Борис Вольфсон занимается веб-разработкой и разработкой программного обеспечения с 2003 года. Карьеру начал в качестве программиста компании «Систем-Софт» в Оренбурге. С 2008 года – руководитель проектов и руководитель регионального отдела разработки в компании Softline.

Рассказ об опыте компании "Softline", конкретно - об опыте Департамента разработки интернет-проектов.