PHP архивация файлов в формате ZIP

Здравствуйте, уважаемые посетители моего блога Курилка.co.ua. Ничто не стоит на месте и такой язык программирования как PHP активно развивается. Если вам необходимо работать с ZIP архивами файлов, вы можете воспользоваться классом ZipArchive. Тем не менее, старые и проверенные временем решения не утратили своей привлекательности.

Но все по порядку. В начале, давайте попытаемся ответить на вопрос: «Что такое zip-архив?»

Zip — популярный формат сжатия данных и архивации файлов. Файл ZIP, чаще всего имеющий расширение .zip, хранит в сжатом или несжатом виде один или несколько файлов, которые можно из него извлечь путём распаковки с помощью специальной программы.

Этот формат был разработан Филом Кацем для использования в программе PKZIP. Впоследствии появилось множество других утилит, создающих файл в таком же формате. Если вас заинтересовал этот вопрос, советую ознакомить с соответствующей статьёй в Википедии.

Ну а теперь к делу. Иногда бывает необходимо хранить файлы в архивах. С одной стороны они меньше по объёму, с другой несколько файлов можно поместить в один. Конечно, для архивации файлов можно воспользоваться специальным программным обеспечением, к примеру WinZip или 7-zip, но в некоторых случаях имеет смысл автоматизировать процесс. В данной заметке мы поговорим о такой штуке как Zip file creation class — класс найденный мной в сборке phpMyAdmin.

Не вдаваясь в подробности, рассмотрим основные его функции:

addFile($data, $name, $time=0)

Описание: добавление файла в архив.
Параметры:

  • $data – содержание файла
  • $name – имя файла в архиве, может содержать путь
  • $time – временная метка (timestamp), по умолчание текущая (не обязательный параметр)

file()

Описание: архивирует и возвращает заархивированные данные в виде строки.

Для наглядности работы с классом приведу небольшой пример:

<?php
include zip.lib.php
$data = "текст файла";
$name = "filename.txt";
$zipfile = new zipfile();
$zipfile->addFile($data, $name);
$zipdata = $zipfile->file();
$fp = fopen ("filename.zip", "w+");
fwrite($fp, $zipdata);
fclose($fp);
?>

Как вы видите, здесь мы создали объект $zipfile, заархивировали данные $data функцией addFile как файл filename.txt и получили архивированные данные функцией file(), которые сохранили как файл filename.zip.

К слову, если вы хотите сохранить файл с кириллическими именами, не забудьте сконвертировать их в досовскую кодировку cp866, к примеру так (за подсказку спасибо Александру):

$filename = iconv('windows-1251', 'cp866', $filename);