Функция PHP для рекурсивного обхода директории и поиска файлов.

PHP функция для рекурсивного обхода директории и поиска файлов, составление списка URL всех файлов директории.

Задача: Нужно решение на PHP позволяющее сделать полный список URL файлов сайта и записать его в файл TXT.

PHP
<?php

/**
 * Функция для рекурсивного обхода директории и поиска файлов.
 *
 * @param string $dir Путь к директории, которую нужно обойти.
 * @param string $baseUrl Базовый URL вашего сайта.
 * @param array &$fileList Массив, в который будут записываться URL файлов (передаётся по ссылке).
 */
function scanDirectory(string $dir, string $baseUrl, array &$fileList): void
{
    // Открываем директорию
    if ($handle = opendir($dir)) {

        // Цикл по содержимому директории
        while (false !== ($entry = readdir($handle))) {

            // Исключаем текущую и родительскую директории
            if ($entry != "." && $entry != "..") {

                $fullPath = $dir . "/" . $entry; // Полный путь к файлу или директории

                //Если это директория, рекурсивно вызываем эту же функцию для неё
                if (is_dir($fullPath)) {
                    scanDirectory($fullPath, $baseUrl, $fileList);
                } else { // Если это файл

                    // Формируем URL файла
                    $url = str_replace($_SERVER['DOCUMENT_ROOT'], $baseUrl, $fullPath); // Заменяем путь от корня сайта на baseUrl
                    $url = str_replace('\\', '/', $url); // Заменяем обратные слэши на прямые (для Windows)

                    // Добавляем URL в список файлов
                    $fileList[] = $url;
                }
            }
        }

        // Закрываем директорию
        closedir($handle);
    }
}

// ******************* НАСТРОЙКИ *******************

// 1.  Укажите путь к корневой директории вашего сайта (обычно DOCUMENT_ROOT)
$rootDirectory = $_SERVER['DOCUMENT_ROOT']; // Или укажите явно:  '/путь/к/сайту'

// 2.  Укажите базовый URL вашего сайта (с протоколом, например: https://example.com)
$baseURL = 'https://ваш_сайт.ru';

// 3.  Укажите имя файла, в который будет записан список URL
$outputFile = 'sitemap.txt';

// ******************* ВЫПОЛНЕНИЕ *******************

// Создаём массив для хранения URL файлов
$fileUrls = [];

// Запускаем сканирование директории
scanDirectory($rootDirectory, $baseURL, $fileUrls);

// Открываем файл для записи
$file = fopen($outputFile, 'w'); // 'w' - открыть для записи (старое содержимое будет удалено)

// Проверяем, успешно ли открыт файл
if ($file) {
    // Записываем каждый URL в отдельную строку файла
    foreach ($fileUrls as $url) {
        fwrite($file, $url . PHP_EOL); // PHP_EOL - символ новой строки (кроссплатформенный)
    }

    // Закрываем файл
    fclose($file);

    echo "Список URL записан в файл: " . $outputFile;

} else {
    echo "Ошибка при открытии файла для записи!";
}

?>

Пояснения к коду:
1. scanDirectory($dir, $baseUrl, &$fileList):

  • Рекурсивная функция, которая обходит директорию $dir.
  • $baseUrl – базовый URL вашего сайта (например, https://example.com).
  • &$fileList – массив, в который будут добавляться URL найденных файлов (передаётся по ссылке, чтобы изменения массива сохранялись между вызовами функции).
  • Функция использует opendir(), readdir(), is_dir() и is_file() для обхода файловой системы.
  • Когда находится файл, его URL формируется путем замены пути от корня сайта (DOCUMENT_ROOT) на baseURL и добавления в массив $fileList.

Настройки:

  • $rootDirectory:  Укажите корневую директорию вашего сайта. По умолчанию используется $_SERVER['DOCUMENT_ROOT'], но можно указать путь явно.
  • $baseURL:  Укажите базовый URL своего сайта (включая https:// или http://).  Это крайне важно для правильного формирования URL.
  • $outputFile:  Имя файла, в который будет записан список URL (например, sitemap.txt).

Выполнение:

  • Создается пустой массив $fileUrls.
  • Вызывается функция scanDirectory() для начала сканирования файловой системы.
  • После завершения сканирования функция fopen() открывает файл для записи ('w' - режим перезаписи).
  • Если файл открыт успешно, происходит перебор массива $fileUrls и каждый URL записывается в файл в отдельной строке (fwrite()). PHP_EOL используется для добавления символа новой строки (он автоматически адаптируется к операционной системе).
  • В конце файл закрывается функцией fclose().
  • Если во время открытия файла произошла ошибка, выводится сообщение об ошибке.

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

  1. Сохраните код: Сохраните код в файл с расширением .php (например, sitemap_generator.php).
  2. Настройте параметры:  Измените значения переменных $rootDirectory, $baseURL и $outputFile в соответствии с вашими настройками.  Особенно важно правильно настроить $baseURL!
  3. Запустите скрипт: Загрузите файл sitemap_generator.php на свой веб-сервер и откройте его в браузере (например, https://ваш_сайт.ru/sitemap_generator.php).
  4. Проверьте файл: После выполнения скрипта в той же директории, где находится sitemap_generator.php, должен появиться файл sitemap.txt (или имя файла, которое вы указали в $outputFile) со списком URL.

Важные замечания:

  • Права доступа: Убедитесь, что у веб-сервера есть права на чтение файлов в корневой директории сайта и на запись в директорию, где находится скрипт.
  • Большие сайты: Для очень больших сайтов этот скрипт может работать долго и потреблять много памяти. В этом случае рассмотрите возможность использования генераторов карт сайта на стороне сервера (например через консоль), или разбейте задачу на несколько частей.
  • Исключения:  В текущей версии скрипта нет возможности исключать определенные файлы или директории из сканирования.  Это можно реализовать, добавив дополнительные условия в функцию scanDirectory(). Например, с помощью strpos() проверять имя файла или директории и пропускать их.
  • htaccess и rewrite: Учитывайте, что данный скрипт не учитывает правила, прописанные в файле .htaccess  и может не правильно определять URL для динамического контента.
  • Безопасность:  Не размещайте этот скрипт в открытом доступе после создания файла sitemap.txt, чтобы предотвратить несанкционированный сбор информации о структуре вашего сайта.  Удалите его или ограничьте доступ.
  • Этот скрипт предоставляет базовую функциональность для создания карты сайта.  Вы можете доработать его, добавив исключения, обработку ошибок, поддержку различных форматов вывода и другие полезные функции.
Дата публикации: 

ТОП 10 случайных публикаций



Сайт разработан студией © WEB-VidST   


Яндекс.Метрика