вобщем клиент заходит на сайт, загружает информацию(изображения, видео, текст) в форму, часть информации идет в базу, часть сохраняется в уникальную папку(лимит загрузки - 100МБ на клиента). Затем входит админ, смотрит инфу и у него должна быть возможность СЛИТЬ все файлы, которые прислал клиент ОДНИМ архивом, из админки.
Я знаю что эта функция должна быть в PHP(например славноизвестная CPanel ее использует регулярно), но ума не приложу как это реализовать?
Ктонибудь с этим работал, знает?
Заранее спасибо! _________________ Fear is the Mind Killer.
Думаю, никому не нужно объяснять, насколько широко сегодня используются zip архивы. Поддержка этого формата реализована во всех современных операционных системах, а библиотеки для работы с ним, написаны для большинства языков программирования.
В этой статье я покажу, как написать небольшой PHP скрипт, создающий zip архив.
Прежде всего, убедитесь, что включена поддержка всех нужных функций. Для этого в файле php.ini нужно убрать символ комментария ( в начале строки:
extension=php_zip.dll
Теперь переходим к созданию архива.
Все операции с архивом выполняются с помощью объекта ZipArchive, создать его не сложно:
$zip = new ZipArchive();
После этого нужно создать файл архива с помощью метода open(), который в качестве параметров принимает имя архива и константу, указывающую способ открытия (об этом чуть позже).
Если на этом этапе ошибок не произошло, то с помощью метода addFile() можно добавить в архив файлы. Метод принимает два параметра:
первый – имя исходного файла;
второй – имя под которым файл будет добавлен в архив (если этот параметр не указан, будет использовано имя из первого параметра).
Примечание. Тут есть один нюанс. Если имя исходного файла “d:/docs/myfile.txt” и вы не укажите второй параметр, то в архиве будет создана папка “d”, а в ней – “docs”. Файл “myfile.txt” будет размещен в “docs”. Чтобы избежать создания папок в архиве просто укажите во втором параметре “myfile.txt”, и тогда файл будет размещен в корне архива.
Завершает работу с архивом метод close().
Так, с теорией закончили. Теперь посмотрим, как все это работает на примере.
Напишем небольшой скрипт, который будет создавать архив со всеми файлами из какой-нибудь папки.
Код:
<?php
//папка в которой будет размещен архив
$archive_dir = "E:/archiveFolder/";
//папка с исходными файлами
$src_dir = "E:/srcFolder/";
//создание zip архива
$zip = new ZipArchive();
//имя файла архива
$fileName = $archive_dir."backup_".date('j_m_Y_h_m_s').".zip";
if ($zip->open($fileName, ZIPARCHIVE::CREATE) !== true) {
fwrite(STDERR, "Error while creating archive file");
exit(1);
}
//добавляем файлы в архив все файлы из папки src_dir
$dirHandle = opendir($src_dir);
while (false !== ($file = readdir($dirHandle))) {
$zip->addFile($src_dir.$file, $file);
}
//закрываем архив
$zip->close();
fwrite(STDOUT, "Archive created\n");
exit(0);
?>
Переменная $src_dir содержит путь к папке с исходными файлами, а $archive_dir – путь к папке в которой будет создан архив.
Примечание: учтите, что наш скрипт эти папки не создает, поэтому сделайте это самостоятельно.
В переменной $fileName содержится имя архива. К имени я добавил дату и время создания архива в формате “день_месяц_год_часы_минуты_секунды”. Это позволяет многократно запускать скрипт и не думать о том, что новая версия архива запишется поверх старой.
В строках 11-14 мы открываем архив, при этом используется константа ZIPARCHIVE::CREATE, которая указывает, что если архива не существует, то он должен быть создан. Если во время создание архива возникли ошибки, выводим сообщение и завершаем работу.
После этого, мы открываем папку с исходными файлами и добавляем их в архив (строки 17-20).
Метод close() (в строке 22) закрывает архив.
PHP здесь не поможет, особенно если в папке надо будет создать архив 100МБ, время выполнения php скрипта в режиме mod_php никто не отменял. Этим кстати грешит и Cpanel, ниразу не удавалось создать архив домашней директории, все время обрывалось на полпути.
PERL Вам в помощь и его расширение Archive-Zip
http://search.cpan.org/~adamk/Archive-Zip/lib/Archive/Zip.pm
P.S. На данном хостинге установлено (/me c опаской посмотрел в сторону Дмитрия ).
P.S. Разве здесь был разговор КАК работает php? По моему скромному мнению jekob вполне себе может позволить выделенный сервер или хотя бы виртуальный выделенный сервер и задать свои настройки на работу php, не говоря уж о запуске php скриптов из командной строки.
ИМХО, если есть задачи постоянно архивировать по 100МБ, то для этого вполне можно виртуальный выделенный сервер арендовать, либо делать не один архив, а несколько. _________________ Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)
ОО, интересная инфа, я что-то даже и не знал о создании зип архивов средствами пхп..
Спасибо топикстартеру и отвечающим. _________________ Пригласительные коды
Разве здесь был разговор КАК работает php? По моему скромному мнению jekob вполне себе может позволить выделенный сервер или хотя бы виртуальный выделенный сервер и задать свои настройки на работу php, не говоря уж о запуске php скриптов из командной строки.
Ни на секунду не усомнился, что jekob может позволить себе выделенный сервер . Исходил из того, что скрипт выполняется на шаред-хостинге. Если же запускать php в CGI режиме, то разницы между использованием скриптов на PHP и PERL нет.
Веденин писал(а):
ИМХО, если есть задачи постоянно архивировать по 100МБ, то для этого вполне можно виртуальный выделенный сервер арендовать, либо делать не один архив, а несколько.
Согласен, что VPS или выделенный сервер для таких задач предпочтительней, но и с VPS на практике не все так радужно, как кажется.
set_time_limit тоже не панацея, как я понял, он не работает в safe_mod режиме. К тому же с точки зрения использования ресурсов сервера, долгоиграющий скрипт в режиме mod_php - не лучший вариант.
safe_mod режим даже на бесплатных хостингах редкость, на платных ... просто не берите такой хостинг
Достаточно легко сделать скрипт на JavaScript, который пошлет хоть сто запросов PHP с указанным интервалом, а в PHP просто в созданный архив будет добавлять немного новых файлов. ИМХО ситуация когда надо архивировать один 100 Мб файл редкость
P.S. Не уверен, что постоянная работа 30 минутного скрипта на Perl не будет "есть" ресурсы. _________________ Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)
Да нет я просто говорил, если вам safe_mode жить мешает, так не стоит брать такой хостинг, платных хостингов хватает _________________ Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)