Данный PHP-скрипт предназначен для автоматического обхода всех папок и файлов в структуре сайта. Он рекурсивно сканирует директории, выводит древовидную структуру проекта и собирает содержимое всех файлов с расширениями .php
и .css
в один текстовый файл project_dump.txt
.
Основные возможности:
-
Формирует дерево всех файлов и папок сайта.
-
Собирает код из
.php
и.css
файлов в один файл. -
Позволяет исключать из анализа определённые папки и файлы (например,
vendor
,.git
, сам скрипт и т.п.). -
Показывает результат прямо в браузере.
Как использовать:
-
Поместите скрипт в корень вашего проекта (например, как
dump_project.php
). -
Откройте скрипт в браузере (
https://ваш_домен/dump_project.php
). -
Структура проекта отобразится на экране, а дамп кода сохранится рядом со скриптом.
<?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>";
?>