Эффективные способы копирования содержимого папки в другую папку в PHP

Копирование содержимого папки из одного места в другое — обычная задача при разработке PHP. Если вам нужно создавать резервные копии, синхронизировать данные или упорядочивать файлы, важно иметь эффективные методы копирования содержимого папок. В этой статье мы рассмотрим несколько подходов с примерами кода, которые помогут вам легко выполнить эту задачу.

Метод 1: использование RecursiveIteratorIterator и RecursiveDirectoryIterator

function copyFolderContents($source, $destination) {
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
        RecursiveIteratorIterator::SELF_FIRST
    );

    foreach ($iterator as $item) {
        $target = $destination . DIRECTORY_SEPARATOR . $iterator->getSubPathName();
        if ($item->isDir()) {
            mkdir($target);
        } else {
            copy($item, $target);
        }
    }
}

Метод 2: использование функции glob()

function copyFolderContents($source, $destination) {
    $files = glob($source . '/*');

    foreach ($files as $file) {
        $target = $destination . '/' . basename($file);
        if (is_dir($file)) {
            mkdir($target);
            copyFolderContents($file, $target);
        } else {
            copy($file, $target);
        }
    }
}

Метод 3: использованиеshell_exec() с командой rsync (требуется доступ к оболочке)

function copyFolderContents($source, $destination) {
    $command = "rsync -a $source/ $destination";
    shell_exec($command);
}

Метод 4. Использование класса ZipArchive

function copyFolderContents($source, $destination) {
    $zip = new ZipArchive;
    $zip->open($destination, ZipArchive::CREATE | ZipArchive::OVERWRITE);

    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($source),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $name => $file) {
        if (!$file->isDir()) {
            $relativePath = substr($file->getPathname(), strlen($source) + 1);
            $zip->addFile($file->getPathname(), $relativePath);
        }
    }

    $zip->close();
}

Копировать содержимое папки в PHP можно различными способами, каждый из которых имеет свои преимущества. В этой статье были продемонстрированы четыре различных подхода, включая использование RecursiveIteratorIterator и RecursiveDirectoryIterator, функции glob(), Shell_exec() с командой rsync и класса ZipArchive. В зависимости от ваших конкретных требований и среды вы можете выбрать наиболее подходящий метод эффективного копирования содержимого папки в PHP.