Архивация файлов в PHP: ZIP и TAR

Раздел: Работа с файлами -> Работа с файлами

Основные способы работы с архивами в PHP

Наиболее эффективным решением для работы с ZIP-архивами является встроенный класс ZipArchive, а для TAR-архивов (в том числе сжатых Gzip/Bzip2) – класс PharData из расширения Phar. Оба расширения обычно включены в стандартную поставку PHP. Ниже представлены базовые примеры их использования.

Создание ZIP-архива


$zip = new ZipArchive();
$filename = 'example.zip';

if ($zip->open($filename, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
    $zip->addFile('file1.txt', 'file1.txt');
    $zip->addFromString('hello.txt', 'Привет, мир!');
    $zip->close();
    echo 'Архив создан';
} else {
    echo 'Ошибка создания архива';
}
  

Include system php (включение системного файла)

Метод open открывает файл для записи. Флаги ZipArchive::CREATE и ZipArchive::OVERWRITE гарантируют создание нового архива. addFile добавляет файл из файловой системы, addFromString – строку с произвольным содержимым.

Извлечение ZIP-архива


$zip = new ZipArchive();
if ($zip->open('example.zip') === TRUE) {
    $zip->extractTo('./extracted/');
    $zip->close();
    echo 'Архив извлечён';
} else {
    echo 'Не удалось открыть архив';
}
  

Ru reading php line (чтение строки из файла php)

Метод extractTo извлекает все файлы в указанную папку. Папка будет создана автоматически, если её не существует.

Создание TAR-архива (без сжатия и со сжатием Gzip)


// Создание tar.gz
$phar = new PharData('archive.tar.gz');
$phar->buildFromDirectory('/path/to/dir');
$phar->compress(Phar::GZ);
// Или сразу tar.gz
$phar = new PharData('archive2.tar.gz');
$phar->buildFromDirectory('/path/to/dir');
  

Php file get html (получение html файла через php)

PharData работает аналогично Phar, но предназначен для неисполняемых архивов. buildFromDirectory рекурсивно добавляет содержимое папки. Для сжатия используется метод compress или указывается расширение файла.

Извлечение TAR-архива


$phar = new PharData('archive.tar.gz');
$phar->extractTo('./extracted_tar/');
  

Php файловая система (работа с файловой системой в php)

Как создать архив только из PHP-файлов в текущей папке?


$zip = new ZipArchive();
$zip->open('php_files.zip', ZipArchive::CREATE);
$files = glob('*.php');
foreach ($files as $file) {
    $zip->addFile($file);
}
$zip->close();
  

скачать страницу php (скачать страницу php (файл))

Использование glob для фильтрации файлов по расширению.

Как извлечь только определённый файл из архива, не распаковывая весь архив?


$zip = new ZipArchive();
$zip->open('example.zip');
$content = $zip->getFromName('file1.txt');
file_put_contents('file1.txt', $content);
$zip->close();
  

Edit home php (редактирование файла home.php)

Метод getFromName возвращает содержимое конкретного файла в виде строки.

Как добавить в архив несколько папок рекурсивно?


$zip = new ZipArchive();
$zip->open('recursive.zip', ZipArchive::CREATE);

$dirs = ['folder1', 'folder2'];
foreach ($dirs as $dir) {
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($dir),
        RecursiveIteratorIterator::LEAVES_ONLY
    );
    foreach ($files as $name => $file) {
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen(realpath($dir)) + 1);
        $zip->addFile($filePath, $dir . '/' . $relativePath);
    }
}
$zip->close();
  

Используется рекурсивный обход папок с сохранением структуры.

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

Проблема: Не удаётся открыть архив (open возвращает false).
Решение: Проверить права на запись в целевую папку, наличие расширения zip (extension=zip в php.ini).

Проблема: При извлечении архива возникает ошибка “permission denied”.
Решение: Убедиться, что папка назначения существует и доступна для записи. Использовать абсолютные пути.

Проблема: Слишком большой архив приводит к исчерпанию памяти.
Решение: Увеличить лимит памяти (memory_limit) или обрабатывать файлы по частям, используя потоковое чтение.

Проблема: PharData не может создать/прочитать TAR архив со сжатием.
Решение: Убедиться, что включено расширение phar и установлены необходимые библиотеки (zlib, bzip2).

- Php создать файл в папке (создание файла в папке в php)
- Edit file php (редактирование php файла)
- Php локальный файл (работа с локальными файлами в php)

Расширенные примеры работы с архивами

1. Создание ZIP-архива с паролем (шифрование)

ZipArchive поддерживает установку пароля только для чтения (не для создания) в стандартной сборке. Однако можно использовать сторонние библиотеки или системные утилиты. Пример с exec (Linux):

Пример

// Предварительно создан обычный zip
shell_exec('zip --password secret archive.zip file1.txt file2.txt');
// Результат: архив защищён паролем

2. Фильтрация файлов при извлечении TAR-архива

Извлечение только файлов с определённым расширением с помощью PharData:

Пример

$phar = new PharData('archive.tar.gz');
$phar->extractTo('./extracted/', null, true); // true - перезаписывать
// Для фильтрации можно перебирать содержимое вручную
foreach (new RecursiveIteratorIterator($phar) as $file) {
    if (pathinfo($file, PATHINFO_EXTENSION) === 'php') {
        $phar->extractTo('./extracted/', $file->getPathname());
    }
}
// Извлекаются только .php файлы

3. Создание архива из строковых данных без временных файлов

Использование php://memory для хранения архива в оперативной памяти:

Пример

$zip = new ZipArchive();
$zip->open('php://memory', ZipArchive::CREATE);
$zip->addFromString('readme.txt', 'Содержимое файла');
$zip->addFromString('data.json', '{"key":"value"}');
$zip->close();
// Получить бинарную строку архива
// В реальном приложении можно записать в БД или отправить пользователю

4. Чтение содержимого ZIP-архива без извлечения (метаданные)

Пример

$zip = new ZipArchive();
$zip->open('example.zip');
for ($i = 0; $i < $zip->numFiles; $i++) {
    $stat = $zip->statIndex($i);
    echo 'Файл: ' . $stat['name'] . "\n";
    echo 'Размер: ' . $stat['size'] . " байт\n";
    echo 'Сжатый размер: ' . $stat['comp_size'] . " байт\n\n";
}
$zip->close();
Файл: file1.txt
Размер: 123 байт
Сжатый размер: 98 байт

Файл: hello.txt
Размер: 25 байт
Сжатый размер: 23 байт

5. Работа с многотомными ZIP-архивами (сплит)

ZipArchive поддерживает создание сплит-архивов (open с флагом ZipArchive::CREATE и последующий вызов setArchiveComment не подходит). Ниже пример с использованием внешней утилиты:

Пример

// Создание обычного архива, затем разбиение
shell_exec('zip large.zip bigfile.dat');
shell_exec('zip -s 10m large_split.zip large.zip');
// Получаются файлы large_split.z01, large_split.z02, large_split.zip

6. Создание TAR-архива с сохранением прав доступа и владельца

PharData не сохраняет Unix-права по умолчанию. Можно использовать системный tar:

Пример

shell_exec('tar --preserve-permissions -czf backup.tar.gz /path/to/data');
// Архив содержит оригинальные права и владельцев

7. Обработка архива в потоке (чтение по частям)

Для больших архивов избежать загрузки всего архива в память помогает ZipArchive с setExternalAttributes не предназначен. Альтернатива – использование PharData с итерацией:

Пример

$phar = new PharData('huge.tar');
foreach ($phar as $file) {
    // Обработка каждого файла по отдельности
    $content = file_get_contents($file->getPathname());
    // ...
}

PHP: работа с архивными файлами (zip, tar) - comments

En
Archive php file (php)