javascript

Пакуем PHP в PHP, чтобы запаковать в JS, чтобы обернуть в HTML

  • среда, 2 сентября 2026 г. в 00:00:10
https://habr.com/ru/articles/1077060/

Прочтя недавний перевод про запаковку БД в 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.

И выглядит это как-то так. Исходники не выкладываю, т.к. проект давно забросил. Статью написал исключительно, чтобы рассказать про распаковку.