Ошибка при формировании архива в PCLZIP

использование PCLZIP в проекте

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

Порыскав в интернете в поисках подходящего архиватора, наткнулся на PCLZIP. Бегло просмотрев код, увидел, что это целиком написанный на PHP архиватор. Без всяких внешне подключаемых модулей, а значит и не зависимый от операционной системы и среды его работы. 🙂 Исполнители очень сильно удивили меня своим решением. Никогда в голове даже не возникало желания написать что-то похожее на PHP. Всегда считал что решать такие задачи нужно на более быстрых языках. C или CPP, например. Но все же решил попробовать.

Нашел русскоязычный сайт с описанием того, как надо работать — http://www.sesmikcms.ru/pages/read/rabota-s-zip-arhivami—pclzip/. Т.к. у этого класса своеобразный интерфейс взаимодействия, с ним сложно самому разобраться и в таких случаях предпочитаю пользоваться примерами, которых на указанной странице в избытке.

Немного почитав информацию, понял, что эта находка стоящая вещь, и надо экспериментировать пробовать создавать необходимый мне архив. Примеры очень хорошо помогли. И примерно через час работы была завершена прослойка для взаимодействия проекта с архиватором.

Протестировав локально на нескольких папках пользовательских проектов и удостоверившись, что все работает корректно, выложил на тестовый сервер для поверки работы связки.

Скорость упаковки меня порадовала. Сервер отвечал практически мгновенно. Локально же упаковывание происходило в течении 15 сек.

Мысленно проклиная windows за ее неповоротливость пошел проверять что получилось в архиве. И оказался неприятно удивлен. Вместо примерно 250 файлов, разложенных по папкам, в архиве был всего один. Самый первый из тех, которые надо было упаковать.

Почитав еще немного информацию, на предложенной выше странице, нашел, что можно проверить что возвращает функция добавления файла в архив. А, начиная со второго файла она возвращала ошибку PCLZIP_ERR_READ_OPEN_FAIL (-2) с описанием Unable to open temporary file <здесь название файла> in binary write mode.

Покопавшись немного в коде архиватора нашел, что скрипт не может создать ременный файл архива, с которым ему предстоит работать. Еще немного поисков и нашел, за папку к временным файлам отвечает константа PCLZIP_TEMPORARY_DIR.

В начале своего скрипта добавил установку константы в нужное мне значение

define( 'PCLZIP_TEMPORARY_DIR', './tmp/' );

и после этого скрипт начал работать «на ура». Правда, не мгновенно отвечает, но упаковка того же набора файлов происходит примерно за 5 сек. Т.е. все равно в 3 раза быстрее, чем на винде, хоть этот сервер и существенно слабее моей домашней рабочей лошадки. Однозначно, следующая машинка будет работать не под виндой. 🙂

Если кому помог, и пригодится такое решение проблемы — буду рад. Если будут другие проблемы в работе скрипта, пишите в комментах — помогу разобраться с ним.

Добавить комментарий

или войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *