Фреймворк для бизнес-приложений: 5 статей экономии в смете
Клиент просит систему записи на приём. В смете появляются недели, которых никто не обсуждал: вход, сброс пароля, очередь писем, ночной отчёт, просмотр сайта глазами клиента. Фреймворк для бизнес-приложений нужен, чтобы этот список не попадал в счёт: одни и те же пять вещей собираются заново в каждом проекте и каждый раз оплачиваются.
Код: Atomic-Framework, лицензия GPL-3.0-or-later.
Atomic Framework собран на Fat-Free Framework: около 2 МБ ядра с аутентификацией, очередями, планировщиком, кешем, командной строкой, WebSocket и менеджером плагинов. В репозитории 1481 тест в 70+ классах, падений нет, 218 пропущено: Redis, Memcached и pcntl на Windows недоступны.
Где фреймворк для бизнес-приложений возвращает часы
1. Вход, сессии и взгляд на сайт глазами клиента
bcrypt с проверкой за постоянное время, новый идентификатор сессии при входе, привязка сессии к IP и User-Agent, два счётчика попыток (по адресу и по учётной записи), OAuth 2.0 через Google, Telegram Login Widget.
Про импорт пользователя обычно забывают в смете. Воспроизвести «клиент не может сохранить заказ» без него значит просить пароль или читать строки руками. Здесь администратор открывает учётную запись, а журнал пишет, кто и когда это сделал.
Два счётчика закрывают разные атаки. Счётчик по адресу гасит перебор по многим учётным записям, счётчик по учётной записи гасит долгий перебор одного пароля. Второй обычно откладывают до первого случая, а случай стоит недели поддержки.
2. Фоновая работа без нового сервиса
Письма, выгрузки, вебхуки и конвертация картинок живут дольше запроса. У очереди два драйвера: Redis со скриптами LUA держит атомарные операции атомарными при параллельности, драйвер базы обходится блокировкой строк. Повтор, TTL и монитор есть у обоих.
Для клиента это вопрос хостинга. Очередь в MySQL работает на общем тарифе, который не хочется менять. Очередь в Redis добавляет один контейнер. Код задания при переезде не меняется.
3. Планировщик, который понимает часовой пояс
Ночной отчёт в 03:00 должен означать 03:00 по часовому поясу клиента, включая неделю перевода часов. Планировщик разбирает выражения POSIX cron, хранит пояс вместе с задачей и останавливает задачу через 300 секунд.
Тайм-аут важнее, чем кажется. Зависшее задание держит цикл, и все задачи за ним пропускают своё окно. Две недели тихого расписания обычно и становятся моментом, когда бизнес узнаёт, что мониторинга нет.
4. Кеш с каскадом
Redis, Memcached, база и файловая система работают через один интерфейс. Если быстрого слоя нет, вызов уходит на следующий вместо исключения. Инвалидация по пространству имён чистит семейство ключей одним вызовом, транзиенты ведут себя привычно для разработчика WordPress.
Четыре драйвера выглядят как склад возможностей. На практике у клиента появляется стенд без Redis и продакшен с ним, и код на обоих одинаковый.
5. Командная строка как документ передачи
45+ команд закрывают рутину. init разворачивает скелет, health проверяет окружение, routes показывает зарегистрированные маршруты, cache/* и queue/* управляют состоянием, migrations/* прогоняет миграции с пакетами и откатом, plugin/* ставит плагин вместе с зависимостями.
Передача начинается со списка команд, а не со скриншота phpMyAdmin. Клиент не видит этого на демо и чувствует на третьем месяце, когда ночью нужно восстановить очередь или откатить миграцию.
Хуки, которые команда WordPress читает без подготовки
add_action и apply_filters работают так же, как в WordPress, рядом с иерархическим диспетчером событий с приоритетами. Студия, которая большую часть года делает сайты на WordPress, ставит приложение на знакомые привычки. Осваивать нужно файл маршрутов, а не новую модель мышления.
Чего в комплекте нет
Генератора админки, конструктора страниц и слоя электронной коммерции. Миграции лежат файлами с метками времени, поэтому изменение схемы пишется руками, а не выводится из моделей. У Laravel больше команд и пакетов, разница в размере ядра: около 2 МБ против примерно 30 МБ.
Честная цена выбора
Лицензия GPL-3.0-or-later. Продукту, который уходит закрытым бинарником или закрытым SaaS, нужна юридическая проверка до первой строки кода, и кто говорит иначе, лицензию не читал. Клиентские сайты живут на GPL без трения, коробочное приложение нет.
Вторая цена это основа на Fat-Free. Она маленькая и стабильная, но это не Laravel, поэтому разработчиков, которые знают её наизусть, меньше. Фреймворк это ставка на следующего человека, который откроет репозиторий, и на встрече об этом стоит сказать вслух.
Как это выглядит в смете
Разработка на PHP идёт примерно по 30–50 $ в час, MVP на Laravel попадает в диапазон 8 000–20 000 $. Пять пунктов выше это и есть та часть, которая исчезает из обеих цифр: отдельного спринта на вход, сервиса очередей, обёртки над cron, адаптера кеша и документа передачи, написанного по памяти.
Остаётся работа, за которую клиент платит: правила бизнеса, интеграции, экраны админки и тесты против предметной области.
Рядом: разработка на PHP о том, как считается объём приложения, микрофреймворк на PHP о младшем брате для одного эндпоинта и автоматизация бизнеса о процессе, который приложение заменяет.
