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() перемещает или переименовывает файл. Её предпочтительнее использовать, когда нужно переместить файл, а не создать его копию.
Этот подход удобен для копирования содержимого файла с возможностью его предварительной обработки в памяти.
Функция эффективно копирует данные из одного потока в другой, что полезно для работы с большими файлами, чтобы избежать загрузки всего содержимого в память.
Создает символическую ссылку на файл вместо его физического копирования, что экономит место на диске, но требует поддержки файловой системой.
Типичные ошибки
<?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
Параметр $context стал необязательным (nullable). Теперь можно явно передавать null вместо создания контекста, если он не требуется.
В PHP 5.3.0 была добавлена возможность использования оберток URL для параметра $from, если включена директива allow_url_fopen. В более ранних версиях поддерживалось только копирование локальных файлов.
Расширенные примеры
<?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
foreach (glob('*.txt') as $txtFile) {
$newName = 'backup/' . basename($txtFile, '.txt') . '_backup.txt';
if (!copy($txtFile, $newName)) {
echo 'Не удалось скопировать: ' . $txtFile . "\n";
}
}
?><?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
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
$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')Модуль fs предлагает методы copyFile() (асинхронный) и copyFileSync() (синхронный).
const fs = require('fs');
fs.copyFileSync('source.txt', 'dest.txt');Команда cp выполняет прямое копирование файлов в файловой системе.
cp source.txt dest.txtCopy в MySQL
Прямого аналога для копирования файлов на уровне SQL нет, но можно использовать SELECT ... INTO OUTFILE и LOAD DATA INFILE для экспорта и импорта данных таблиц в файлы.