Создание zip архивов с помощью PHP скрипта

6 ноября, 2007

Думаю, никому не нужно объяснять, насколько широко сегодня используются zip архивы. Поддержка этого формата реализована во всех современных операционных системах, а библиотеки для работы с ним, написаны для большинства языков программирования.
В этой статье я покажу, как написать небольшой PHP скрипт, создающий zip архив.

Прежде всего, убедитесь, что включена поддержка всех нужных функций. Для этого в файле php.ini нужно убрать символ комментария (;) в начале строки:
extension=php_zip.dll

Теперь переходим к созданию архива.
Все операции с архивом выполняются с помощью объекта ZipArchive, создать его не сложно:

  1. $zip = new ZipArchive();

После этого нужно создать файл архива с помощью метода open(), который в качестве параметров принимает имя архива и константу, указывающую способ открытия (об этом чуть позже).

Если на этом этапе ошибок не произошло, то с помощью метода addFile() можно добавить в архив файлы. Метод принимает два параметра:
первый – имя исходного файла;
второй – имя под которым файл будет добавлен в архив (если этот параметр не указан, будет использовано имя из первого параметра).

Примечание. Тут есть один нюанс. Если имя исходного файла “d:/docs/myfile.txt” и вы не укажите второй параметр, то в архиве будет создана папка “d”, а в ней – “docs”. Файл “myfile.txt” будет размещен в “docs”. Чтобы избежать создания папок в архиве просто укажите во втором параметре “myfile.txt”, и тогда файл будет размещен в корне архива.

Завершает работу с архивом метод close().

Так, с теорией закончили. Теперь посмотрим, как все это работает на примере.

Напишем небольшой скрипт, который будет создавать архив со всеми файлами из какой-нибудь папки.

  1. <?php
  2. //папка в которой будет размещен архив
  3. $archive_dir = "E:/archiveFolder/";
  4. //папка с исходными файлами
  5. $src_dir = "E:/srcFolder/";
  6.  
  7. //создание zip архива
  8. $zip = new ZipArchive();
  9. //имя файла архива
  10. $fileName = $archive_dir."backup_".date('j_m_Y_h_m_s').".zip";
  11. if ($zip->open($fileName, ZIPARCHIVE::CREATE) !== true) {
  12.     fwrite(STDERR, "Error while creating archive file");
  13.     exit(1);
  14. }
  15.  
  16. //добавляем файлы в архив все файлы из папки src_dir
  17. $dirHandle = opendir($src_dir);
  18. while (false !== ($file = readdir($dirHandle))) {
  19.     $zip->addFile($src_dir.$file, $file);
  20. }
  21. //закрываем архив
  22. $zip->close();
  23.  
  24. fwrite(STDOUT, "Archive created\n");
  25.  
  26. exit(0);
  27. ?>

Переменная $src_dir содержит путь к папке с исходными файлами, а $archive_dir – путь к папке в которой будет создан архив.

Примечание: учтите, что наш скрипт эти папки не создает, поэтому сделайте это самостоятельно.

В переменной $fileName содержится имя архива. К имени я добавил дату и время создания архива в формате “день_месяц_год_часы_минуты_секунды”. Это позволяет многократно запускать скрипт и не думать о том, что новая версия архива запишется поверх старой.

В строках 11-14 мы открываем архив, при этом используется константа ZIPARCHIVE::CREATE, которая указывает, что если архива не существует, то он должен быть создан. Если во время создание архива возникли ошибки, выводим сообщение и завершаем работу.

После этого, мы открываем папку с исходными файлами и добавляем их в архив (строки 17-20).
Метод close() (в строке 22) закрывает архив.

Запускаем скрипт:
php путь_к_скрипту\имя_скрипта.php

Если ошибок не было, в папке "E:/archiveFolder/" вы будет создан архив.

Как видите, ничего сложного. В следующий раз я покажу как извлечь файлы из архива.

Понравилась статья? Подпишитесь на продолжение rss link !

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в PHP

]]>

Комментарии (15)

Вы можете отслеживать обсуждение записи с помощью RSS 2.0 rss link

Вы также можете оставить комментарий, или трекбек с Вашего сайта.

  1. Виктор 09.01.2008 в 11:21 (Ответить)

    А можно ли задать уровень компрессии (минимальный, максимальный…)?

  2. Владимир 09.01.2008 в 17:16 (Ответить)

    Честно говоря, я не нашел в документации четкого ответа.
    Но для создания архива PHP использует библиотеку zlib, для которой в php.ini можно задать два параметра:
    zlib.output_compression
    zlib.output_compression_level

    Если есть желание, попробуйте поиграться.

  3. Юлия 05.02.2008 в 14:47 (Ответить)

    А обязательно прописывать путь, по которому будет создан архив? Можно ли сделать так, чтобы пользователь сам выбрал, куда он хочет сохранить свой файл архива?

    1. Владимир 05.02.2008 в 15:29 (Ответить)

      Можно, только это зависит от интерфейса с которым работает пользователь.

      Если используется web интерфейс, то, один из вариантов, создать форму в которую он будет вводить путь к архиву. А после этого подставлять введенный путь.

  4. Вячеслав 07.03.2008 в 09:47 (Ответить)

    а можно ли зазиповать целую папку с файлами?

    1. Владимир 07.03.2008 в 20:12 (Ответить)

      Одной строкой кода - нет.
      Но в этой статье я привел скрипт создания архива целой папки (последний листинг). Он в цикле проходит по всей папке и добавляет в архив все найденные файлы.
      В общем-то его не сложно изменить для просмотра вложенных папок.

  5. Иоган 15.04.2008 в 18:37 (Ответить)

    :( у меня не работает, пишет
    "Fatal error: Cannot instantiate non-existent class: ziparchive in y:\home\localhost\www\foto\index.php on line 10"
    хотя и в файле пхп.ини убрал значок комента….
    в чем дело??может потомучто у меня стоит Денвер?

  6. Иоган 15.04.2008 в 19:20 (Ответить)

    я уже даже скачал php_zip.dll и закинул в папку extensions…ошибка всё таже… почему не работает….??

  7. Владимир 16.04.2008 в 14:04 (Ответить)

    Посмотрите, что выводит phpinfo(). Там должен быть раздел zip. И в нем параметры
    Zip: enabled

    Extension Version: $Id: php_zip.c,v 1.1.2.38 2007/08/06 22:02:32 bjori Exp $

    Zip version: 2.0.0

    Libzip version: 0.7.1

    Версии могут отличаться.

  8. Иоган 18.04.2008 в 20:17 (Ответить)

    там написано:
    Zip support: enabled

    и всё! как его подключать?

    1. Владимир 19.04.2008 в 21:37 (Ответить)

      Подключать никак не надо. После того как библиотека загружена, $zip = new ZipArchive(); должен создать объект.

      Вообще ситуация странная. Если хотите, отправьте мне скрипт по email, попробую запустить у себя.

  9. OnlineZip 20.05.2008 в 20:46 (Ответить)

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

  10. [...] Создание zip архивов с помощью PHP скрипта [...]

  11. koza4ok 05.08.2008 в 10:37 (Ответить)

    Внедрил скрипт, всё вроде хорошо работает, но если размер архива достигает 128кб, возвращаетса битый архив… счем может быть связана проблемма?

    1. Владимир 05.08.2008 в 14:40 (Ответить)

      Возможная причина - ограничение времени выполнения скрипта или максимального объема памяти.
      Настройки в php.ini:
      memory_limit
      max_execution_time

Оставить комментарий

Введите ваш комментарий

* - обязательные для заполнения поля

Quicktags:

]]>