1

Copy: примеры (PHP)

Функция copy в PHP: полный обзор с практическими примерами
Раздел: Работа с файловой системой
copy(string $from, string $to, ?resource $context = null): bool

Основные сведения о функции copy()

Назначение

Функция copy() в PHP выполняет копирование файла из исходного расположения в указанное место назначения. Она применяется для дублирования файлов в рамках файловой системы сервера, например, при резервном копировании, обработке загрузок пользователей или создании кэшированных версий контента.

Синтаксис и параметры
bool copy(string $from, string $to, ?resource $context = null)
  • $from (string) - Путь к исходному файлу, который необходимо скопировать.
  • $to (string) - Путь к целевому файлу. Если файл уже существует, он будет перезаписан.
  • $context (resource) - Опциональный ресурс контекста потока, создаваемый функцией stream_context_create(). Может использоваться для задания специальных параметров, например, HTTP-заголовков при копировании по сети.

Функция возвращает true в случае успеха или false при неудаче.

Примеры использования

Простое копирование файла
<?php
$result = copy('source.txt', 'destination.txt');
var_dump($result);
?>
bool(true)
Копирование с проверкой существования исходного файла
<?php
$source = 'image.jpg';
$dest = 'backup/image_backup.jpg';

if (file_exists($source)) {
    if (copy($source, $dest)) {
        echo 'Файл скопирован.';
    } else {
        echo 'Ошибка копирования.';
    }
} else {
    echo 'Исходный файл не найден.';
}
?>
Файл скопирован.
Использование контекста потока
<?php
// Создание контекста с опцией отключения обертки SSL для HTTPS
$context = stream_context_create([
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false,
    ],
]);

// Копирование файла с удаленного HTTPS-сервера (если allow_url_fopen включен)
$result = copy('https://example.com/file.zip', 'local_file.zip', $context);
var_dump($result);
?>
bool(true)

Альтернативные функции в PHP

Функция rename() перемещает или переименовывает файл. Её предпочтительнее использовать, когда нужно переместить файл, а не создать его копию.

file_put_contents() в комбинации с file_get_contents()

Этот подход удобен для копирования содержимого файла с возможностью его предварительной обработки в памяти.

stream_copy_to_stream()

Функция эффективно копирует данные из одного потока в другой, что полезно для работы с большими файлами, чтобы избежать загрузки всего содержимого в память.

Создает символическую ссылку на файл вместо его физического копирования, что экономит место на диске, но требует поддержки файловой системой.

Типичные ошибки

Отсутствие прав на запись в целевую директорию
<?php
// Предположим, папка /var/www/secure доступна только для чтения
$result = copy('data.txt', '/var/www/secure/data.txt');
var_dump($result); // false
var_dump(error_get_last()); // Получение последней ошибки
?>
bool(false)
array(4) {
  ["type"]=> int(2)
  ["message"]=> string(XXX) "copy(): failed to open stream: Permission denied"
  ...
}
Попытка копирования несуществующего исходного файла
<?php
$result = copy('non_existent.txt', 'dest.txt');
if ($result === false) {
    echo 'Не удалось скопировать файл.';
}
?>
Не удалось скопировать файл.
Исчерпание доступного места на диске

При копировании очень большого файла на диск с недостаточным свободным местом операция завершится неудачей, и функция вернет false.

Изменения в последних версиях PHP

PHP 8.0.0

Параметр $context стал необязательным (nullable). Теперь можно явно передавать null вместо создания контекста, если он не требуется.

Предыдущие версии

В PHP 5.3.0 была добавлена возможность использования оберток URL для параметра $from, если включена директива allow_url_fopen. В более ранних версиях поддерживалось только копирование локальных файлов.

Расширенные примеры

Копирование с созданием директорий
Пример php
<?php
function copyAndCreateDir($source, $dest) {
    $dir = dirname($dest);
    if (!is_dir($dir)) {
        mkdir($dir, 0777, true);
    }
    return copy($source, $dest);
}

$result = copyAndCreateDir('file.txt', 'some/deep/nested/path/file.txt');
var_dump($result);
?>
bool(true)
Пакетное копирование файлов по маске
Пример php
<?php
foreach (glob('*.txt') as $txtFile) {
    $newName = 'backup/' . basename($txtFile, '.txt') . '_backup.txt';
    if (!copy($txtFile, $newName)) {
        echo 'Не удалось скопировать: ' . $txtFile . "\n";
    }
}
?>
Копирование файла с удаленного сервера по HTTP с базовой аутентификацией
Пример php
<?php
$context = stream_context_create([
    'http' => [
        'header' => "Authorization: Basic " . base64_encode("user:pass")
    ]
]);

$result = copy('http://example.com/protected/file.pdf', 'local.pdf', $context);
?>
Обработка ошибок с помощью собственного обработчика
Пример php
<?php
set_error_handler(function($errno, $errstr) {
    throw new Exception($errstr);
});

try {
    copy('invalid_source', 'dest.txt');
} catch (Exception $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
restore_error_handler();
?>
Ошибка: copy(): failed to open stream: No such file or directory
Логирование процесса копирования большого количества файлов
Пример php
<?php
$files = ['a.jpg', 'b.jpg', 'c.jpg'];
$log = [];

foreach ($files as $file) {
    $dest = 'backup/' . $file;
    if (copy($file, $dest)) {
        $log[$file] = 'Успешно';
    } else {
        $log[$file] = 'Ошибка';
    }
}

file_put_contents('copy.log', print_r($log, true));
?>

Аналоги в других языках программирования

Copy в Python

Модуль shutil предоставляет функцию copy2(), которая сохраняет метаданные.

import shutil
shutil.copy2('source.txt', 'dest.txt')
JavaScript (Node.js)

Модуль fs предлагает методы copyFile() (асинхронный) и copyFileSync() (синхронный).

const fs = require('fs');
fs.copyFileSync('source.txt', 'dest.txt');
Bash/Shell

Команда cp выполняет прямое копирование файлов в файловой системе.

cp source.txt dest.txt

Copy в MySQL

Прямого аналога для копирования файлов на уровне SQL нет, но можно использовать SELECT ... INTO OUTFILE и LOAD DATA INFILE для экспорта и импорта данных таблиц в файлы.

PHP copy function comments

En
Copy Copies file