Пакуем PHP в PHP, чтобы запаковать в JS, чтобы обернуть в HTML
- среда, 2 сентября 2026 г. в 00:00:10
Прочтя недавний перевод про запаковку БД в exe, решил рассказать об идее, которую реализовал лет 6 назад в своем домашнем проекте. Сам проект недоделал и ценность его в 2026 сомнительна, но речь в статье о реализации архитектуры файлов и их запаковке, а не о проекте.
Суть проекта в двух словах: генератор CRUD API
User case: я хочу на любом самом дешевом хостинге быстро развернуть REST API с типовым набором CRUD операций (создание, изменение, поиск) для произвольной структуры данных. Это API должно устанавливаться, как типичная CMS для сайтов (типа WordPress) и из коробки иметь полный набор фич работы с данными (логирование изменений, выгрузку в файл, расширенный поиск, ролёвку и пермиссии и т.п.)
Области применения видел две:
быстрое поднятие админок к другим проектам (см. генератор админок)
создание очень реалистичных фишинговых сайтов
И в целом, что-то такое я написал. Вот пример копий созданных за день фейка вконтакта и мамбы (можете открыть Network и посмотреть структуру запросов + авто-сгенерированная документация и тесты на все запросы). Но речь не про это, поэтому переходим а архитектуре и начнем собирать наш пакет с пакетами.
Cервер c CRUD API
ТЗ: я хочу иметь сервер c CRUD API на PHP состоящий из минимума файлов
Реализация:
JSON описывает данные (какие сущности, какие поля, какие возможны запросы, из каких БД и т.п.). Например:
{ title: "user" properties: { firstName: { type: "string", minLength: 3, ... ... } }
PHP принимает входящий запрос и разбирает его согласно правилам описанным в JSON`е. Код ванильный. Никаких зависимостей от внешних библиотек и фреймворков. Это позволит нам собрать все в один файл. Для сборки я написал скрипт, который читает содержимое папки с PHP и собирает весь код в один файл на основе дерева зависимостей (ищем все include / include_once).
.htaccess редиректит запросы с разных URL на один PHP файл.
Пока все просто. На входе есть три файла и нам нужно написать установщик, как в модной CMS.
Установочный файл этого сервера
ТЗ: я хочу иметь установочный файл, как у любой приличной CMS системы. Желательно один index.php, который я кидаю в папку и оно само разворачивается.
Реализация: Я могу поместить несколько файлов в один ввиде комментариев. Инсталлятор прочтет сам себя. Вырежет комментарии и создаст новые файлы. В конце удалит сам себя.
<?php # JSON с описанием данных # .htaccess файл # php код сервера -- КОД УСТАНОВЩИКА ДЛЯ РАСПАКОВКИ -- 1. Читает сам себя и распаковывает 2. Или отдает UI инсталятора (типа: $ui = "<html><style>....") ?>
Так же я отдельно сверстал красивую страницу с формой для установки (host/user/pas БД, и т.п. настройки сервера) — это HTML / CSS / JS. При том CSS и JS мы можем вставить внутрь HTML, а его внутрь PHP (см. схему выше).
Это круто! В большинстве CMS я копирую папку с файлами, но тут ровно один файл и это не zip архив, а готовый к запуску php. Но мы пойдем дальше и завернем это ещё раз.
Генератор установочных файлов
ТЗ: я хочу иметь сайт, где через UI я описываю JSON-схему данных и скачиваю себе установочный файл CRUD-API сервера с зашитым в него описанием моей схемы.
Ограничение: я хочу использовать бесплатный хостинг, чтобы не платить за него. Обычно на таких хостингах доступна только статика. Следовательно, «генератор» должен собрать мне установочный файл используя только JS (без бекенда)
Реализация: во всем коде выше не должно быть ни одного символа `. Тогда я смогу взять код инсталлятора, обернуть его в «шаблонные строки JS» и на лету подставить строчку с JSON файлом. Например:
<script> const JSON = ... const template = `<?php # ${JSON} ... `; </script>
Ну и т.к. тут мы пишем на JS, а браузер кушает HTML, то сверстав страницу «конструктора» мы снова инлайним JS и CSS в HTML
Итого
На выходе я получаю HTML файл (это), где могу мышкой натыкать структуру БД и он мне выдаст PHP файл. Я могу закинуть его на хостинг, заполнить данные (хост, логин, пас БД) и нажать установить. Оно прочтет сам себя и перезапишется в виде трех файлов сервера CRUD API.
И выглядит это как-то так. Исходники не выкладываю, т.к. проект давно забросил. Статью написал исключительно, чтобы рассказать про распаковку.