Фреймворк для бізнес-додатків: 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 про молодшого брата для одного ендпоінта і автоматизація бізнесу про процес, який застосунок замінює.
