понедельник, 16 марта 2009 г.

ZIP средствами PHP. Введение

Эта проблема редко возникает на сайтах. Но тут разбираясь во внутреностях WP, я увидела одно прекрасное средство, загрузки и обновления всей системы- это импорт плагинов в виде запакованого файла в формате ZIP. В принципе от этого можно и обойтись, и, используя загрузку через FTP, с последующей распаковкой средствами удаленного сервера, но как то стало просто интересно посмотреть, можно ли организовать подобный сервис в режиме он-лайн, обычными средствами HTTP, так как ручной механизм загрузки и последующей распаковки годится только для IT-специалистов, и совсем не подходит для обычных юзверей, которые постоянно хотят приобщиться к тайнам интернета
Заглянув в "святые-святых" WP, и по-капавшись в его внутренностях, я нашла тот основной файл, с помощью которого и происходит реаллизация этого великолепного сервиса, как загрузка модуля плагина средствами установки запакованного файла, с последующей ее распоковкой на стороне удаленной машины, в конкретную дирректорию, с определенными, для этого случая начальными или подготовительными сервисами и окончательными или завершающими операциями.

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

Читатель возможно спросит
- А разве нет ли штатных средств, для работы с ZIP форматами в Инете.
На что я отвечу, что
- Есть - но добавлю - Для того чтоб ими воспользоваться, то необходимо просить хостеров включить подобные средства в стандартный поставляемый PHP, что не всегда возможно, а зачастую просто - просить не кого, ибо мы часитенько работаем на всяких бесплатных рессурсах, где вообще ни чего для юзверей не делают - на халяву.

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

Начнем с того - каким способом это делается в WP, а потом, рассмотрев форматы ZIP, привести необходимые скрипты для решения нашей задачи.
Как это делается в WordPress
Главными файлами которые выполняют эти операции в WP это два модуля, расположенные в админской части движка.
  • /wp-admin/include/file.php
    функция unzip_file($from,$to)

  • /wp-admin/include/class-pclzip.php
    класс - PclZip

Имено последний файл и выполняет все необходимве преобразования с форматом ZIP файла. А конкретно этот класс выполняет следующие основные операции, с различными настройками, передаваемые через аргументы в виде опций. Вот конкретно все возможные операции
  • PclZip() : Конструктор объекта

  • create() : Создать Zip-архив и добавить в него файлы
  • listContent() : Список входящих файлов и структура Zip-архива
  • extract() : Экстрактирование контента из Zip-архива
  • properties() : получение свойств Zip-архива

Так вот WP использует лишь одну единственную возможность, этого огромадного файла, и только с единственной из парудесятков возможных опций использования данной функции - extract(), а имено распаковка ZIP-архива в виде массива данных в оперативную память. Укладку получено информации выполняется в другом файле, приведенном ранее.