Данный PHP-скрипт предназначен для автоматического обхода всех папок и файлов в структуре сайта. Он рекурсивно сканирует директории, выводит древовидную структуру проекта и собирает содержимое всех файлов с расширениями .php и .css в один текстовый файл project_dump.txt.

Основные возможности:

  • Формирует дерево всех файлов и папок сайта.

  • Собирает код из .php и .css файлов в один файл.

  • Позволяет исключать из анализа определённые папки и файлы (например, vendor, .git, сам скрипт и т.п.).

  • Показывает результат прямо в браузере.

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

  1. Поместите скрипт в корень вашего проекта (например, как dump_project.php).

  2. Откройте скрипт в браузере (https://ваш_домен/dump_project.php).

  3. Структура проекта отобразится на экране, а дамп кода сохранится рядом со скриптом.

<?php
/**
 * --------------------------------------------------------
 * 📦 Утилита для дампа структуры проекта и сбора кода
 * --------------------------------------------------------
 * Этот PHP-скрипт:
 * - Рекурсивно обходит директории от текущего каталога
 * - Выводит древовидную структуру всех папок и файлов
 * - Сохраняет содержимое всех .php и .css файлов в один файл
 *
 * Использование:
 * 1. Поместите скрипт в корень проекта (например, dump_project.php)
 * 2. Откройте его в браузере: https://ваш_домен/dump_project.php
 * 3. После выполнения:
 *    - В браузере будет отображена структура проекта
 *    - В файл `project_dump.txt` будет сохранён весь код
 *
 * --------------------------------------------------------
 * 🧑‍💻 Разработчик: Пыников Дмитрий
 * 🌐 Сайт: https://pynikov.org
 * ✉️ Email: dmitry@pynikov.org
 * 💼 Проекты под ключ: PHP, базы данных, веб-разработка
 * --------------------------------------------------------
 */

// Название выходного файла с собранным кодом
$outputFile = __DIR__ . '/project_dump.txt';

// Папки, которые будут пропущены при обходе
$skipDirs = [
    'vendor',
    'node_modules',
    '.git',
];

// Файлы, которые следует игнорировать (в том числе сам скрипт)
$skipFiles = [
    basename(__FILE__), // Не включаем сам скрипт
];

// Расширения файлов, содержимое которых нужно сохранить
$extensionsToDump = ['php', 'css'];

/**
 * Рекурсивный обход директорий и сбор информации.
 *
 * @param string $dir      Путь к текущей директории
 * @param string $indent   Отступ (для отображения древовидной структуры)
 * @param resource $fh     Открытый файл для записи содержимого
 * @return string          Возвращает строку со структурой проекта
 */
function scanDirectoryTree($dir, $indent = '', $fh = null): string
{
    global $skipDirs, $skipFiles, $extensionsToDump;
    $result = '';

    if (!is_readable($dir)) {
        return $indent . "[Недоступна] $dir\n";
    }

    $files = scandir($dir);
    if (!$files) {
        return $indent . "[Ошибка чтения] $dir\n";
    }

    foreach ($files as $file) {
        if ($file === '.' || $file === '..') continue;

        $fullPath = $dir . DIRECTORY_SEPARATOR . $file;

        if (is_dir($fullPath)) {
            if (in_array($file, $skipDirs)) continue;
            $result .= $indent . "📁 $file\n";
            $result .= scanDirectoryTree($fullPath, $indent . "    ", $fh);
        } else {
            if (in_array($file, $skipFiles)) continue;
            $result .= $indent . "📄 $file\n";

            $fileExtension = pathinfo($file, PATHINFO_EXTENSION);
            if (in_array($fileExtension, $extensionsToDump)) {
                $content = file_get_contents($fullPath);
                if ($content !== false) {
                    fwrite($fh, "\n\n============================\n");
                    fwrite($fh, "Файл: $fullPath\n");
                    fwrite($fh, "============================\n");
                    fwrite($fh, $content);
                }
            }
        }
    }

    return $result;
}

// Открытие файла для записи
$fh = fopen($outputFile, 'w');
if (!$fh) {
    die("❌ Не удалось создать или открыть файл: $outputFile");
}

// Заголовок в файле дампа
fwrite($fh, "📦 Сборка проекта\n");
fwrite($fh, "Дата: " . date('Y-m-d H:i:s') . "\n");
fwrite($fh, str_repeat('=', 40) . "\n");

// Обход с корневой директории
$structure = scanDirectoryTree(__DIR__, '', $fh);

// Закрытие файла
fclose($fh);

// Вывод в браузер
echo "<pre>";
echo "📂 Структура вашего проекта (от корня):\n\n";
echo $structure;
echo "\n\n✅ Содержимое .php и .css файлов собрано в:\n  " . basename($outputFile);
echo "</pre>";
?>