Как в php просто заархивировать папку целиком
Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2013
Помог: 0 раз(а)
Подскажите как заархивировать файлы на хостинге с помощью этого фтп клиента.
Отправлено: 14 Марта, 2013 — 18:27:50
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012
Откуда: Украина, Львов
Помог: 127 раз(а)
никак
(Добавление)
скачать на комп, заархивировать и залить
Отправлено: 14 Марта, 2013 — 18:29:38
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010
Откуда: Чернигов
Помог: 299 раз(а)
По-моему по фтп невозможно заархивировать файл т.к. для архивации нужен архиватор, а фтп ничего не знает об установленых программах на сервере. (хотя это только моё предположение)
——
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново — вы явно что-то делаете не так.
Отправлено: 14 Марта, 2013 — 19:45:40
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
с чего вы взяли, что это возможно?
——
Чем больше узнаю, тем больше я не знаю.
Отправлено: 15 Марта, 2013 — 04:28:29
Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2013
Помог: 0 раз(а)
Просто подумал что есть такая функция, потому как неудобно скачивать когда много файлов
(Отредактировано автором: 15 Марта, 2013 — 04:29:06)
Отправлено: 15 Марта, 2013 — 04:34:42
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008
Откуда: Альфа Центавра
Помог: 353 раз(а)
gadjet пишет:
потому как неудобно скачивать когда много файлов
А ты каждый файл отдельно коцаешь?
Коцни верхнюю папку, дальше само и в папку зайдет и скачает оттуда рекурсивно.
В чем проблема?
Время архивации большого кол-ва файлов + скачивание одного файла + разархивирование его локально = в полтора раза больше времени, чем просто скачать файлы, не?
Трололо..
Отправлено: 15 Марта, 2013 — 05:52:17
Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2013
Помог: 0 раз(а)
DeepVarvar пишет:
А ты каждый файл отдельно коцаешь?
Нет, качаю папку целиком.
Когда качаешь архив уходит времени на вскиду в 10 раз меньше чем когда закачиваешь папку с большим количеством файлов того же объема.
Архив 20мб качается за неск. секунд. А папка, не знаю точно, но покурить успеваю)))
Отправлено: 15 Марта, 2013 — 05:55:27
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008
Откуда: Альфа Центавра
Помог: 353 раз(а)
DeepVarvar пишет:
архивации большого кол-ва файлов . в полтора раза больше времени
Смысл? Всеравно курить пойдешь.
Отправлено: 15 Марта, 2013 — 06:01:09
Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2013
Помог: 0 раз(а)
DeepVarvar пишет:
Смысл? Всеравно курить пойдешь.
Отправлено: 15 Марта, 2013 — 07:30:57
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008
Откуда: Альфа Центавра
Помог: 353 раз(а)
У тебя странное желание бросить курить посредством недоказанного увеличения скорости скачивания путем предварительного архивирования файлов..
Если хочешь бросить курить — найди нормальный стимул. Ничего не нужно. Ни плацебо, ни пластыри — только твой собственный внутренний стимул.
З.Ы.: У меня получилось.
Отправлено: 15 Марта, 2013 — 09:05:18
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009
Откуда: Россия, Санкт-Петербург
Помог: 617 раз(а)
DeepVarvar пишет:
Время архивации большого кол-ва файлов + скачивание одного файла + разархивирование его локально = в полтора раза больше времени, чем просто скачать файлы, не?
Для большой кучи мелких файлов — очень большой оверхед на протокол и задержки сети.
Действительно с архивированием, передачей одного файла и разархивированием быстрее.
Но FTP так не умеет. (42 ему, как-никак)
Отправлено: 15 Марта, 2013 — 10:18:17
Покинул форум
Сообщений всего: 5
Дата рег-ции: Март 2013
Помог: 0 раз(а)
Мелкий пишет:
Для большой кучи мелких файлов — очень большой оверхед на протокол и задержки сети.
Действительно с архивированием, передачей одного файла и разархивированием быстрее.
Есть способ обойти эту проблему, если хостинг не поддерживает архивацию файлов?
Поменять хостинг пока не имею возможности.
Отправлено: 15 Марта, 2013 — 18:05:32
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
gadjet пишет:
хостинг не поддерживает архивацию файлов?
не хостинг, а протокол обмена данными по названием FTP (File Transfer Protocol)
(Добавление)
gadjet пишет:
Есть способ обойти эту проблему,
навскидку: аписать php скрипт, при обращениии к которому, файлы будут архивироваться и отдатваться пользователю
——
Чем больше узнаю, тем больше я не знаю.
Скрипт работы с файлами
Удобный и многофункциональный файловый менеджер написанный на языке PHP+AJAX.
Новое в версии:
— Возможность копировать и перемещать папки
— Работа с zip архивами ( возможность архивировать файлы и папки, добавлять комментарии к архиву, возможность извлекать целые архивы)
— Работа с сокетами
Удобный и многофункциональный файловый менеджер написанный на языке PHP+AJAX.
Позволяет управлять файлами и папками расположенными на сервере.
Расширяемый набор модулей для администрирования данных на сайте через AJAX WEB-интерфейс.
Содержит базовый класс-контейнер и набор подключаемых PHP-плагинов, выполняющих админские функции.
Скрипт выводящий контент папки сервера, в которую он вкинуть, и 50 папок выше.
Можно настроить так, чтобы все могли видеть контент или защитить его паролем.
Простой, но удобный файловый менеджер, умеет выполнять стандартные действия с файлами и поддерживает архивирование папок целиком. Для картинок рисует маленькие их копии (tumbnails), для каждого типа файлов свой значок.
Архивировать и разархивировать файлы через PHP
При создании разных программ через php вам может пригодиться метод создания архивов на сервере, в которые можно поместить не только файлы, но и целые папки. Большим преимуществом php является присутствие встроенного функционала для работы с zip архивами.
Итак, чтобы работать с архивами в php нужно использовать класс ZipArchive . Он позволяет не только архивировать папки, но и разархивировать их в указанную вами директорию. При работе с ним стоит помнить про кириллические названия — они не поддерживаются. Поэтому название архива, файлов и папок должны быть латиницей, без пробелов.
Создадим архив из файлов. Для этого используем следующий код:
//Заархивируем файлы
$zip = new ZipArchive(); //Создаём объект для работы с ZIP-архивами
$zip->open(«archive.zip», ZIPARCHIVE::CREATE); //Открываем или создаем архив, если его не существует
$zip->addFile(«in.php»); //Добавляем в архив файл in.php
$zip->addFile(«styles/style.css»); //Создаем папку styles и добавляем файл style.css
$zip->close(); //Завершаем работу с архивом
?>
По комментариям к примеру, думаю, ясно как архивировать файлы. После работы скрипта создастся archive.zip, в котором будет файл in.php и папка styles, содержащая файл style.css.
Теперь разархивируем файлы с произвольного архива. Для этого используем код:
//Разархивируем файлы архива
$zip = new ZipArchive;
if ($zip -> open(‘archive.zip’) === TRUE) $zip -> extractTo(‘filess’); //Извлекаем файлы из архива в папку filess. Если паки не существует — создаст ее.
$zip -> close(); >
else echo ‘Ошибка при обращении к архиву’;
?>
Данные два примера — это основы работы с классом ZipArchive(). Рассмотрим другие функции и возможности:
$zip->addGlob(‘*.’, GLOB_BRACE); //Добавляем в архив файлы с определенным расширением
$zip->addFromString(‘test.txt’, ‘строка-содержимое файла’); — может создать файл сразу с содержимым.
$zip->deleteName(‘in.php’); $zip->deleteName(‘testDir/’); //Удаляет файл или директорию из архива
$zip->renameName(‘currentname.txt’,’newname.txt’); //Переименовывает элемент по его имени
$zip->setArchiveComment(‘Комментарий’); //Устанавливает комментарий к ZIP-архиву
$zip->open(«archive.zip», ZIPARCHIVE::CREATE); //Создаем архив archive.zip
$zip->open(«files/archive.zip», ZIPARCHIVE::CREATE); //Создаем архив archive.zip в папке files
$zip->addFile(путь исходного файла, имя под которым файл будет добавлен в архив);
$zip->addFile(files/archive.zip, 12.zip); // обычный пример
$zip->addFile(files/archive.zip, img/12.zip); //сохранили файл из files в img
$zip->addFile(files/archive.zip); // возьмет из files/archive.zip и сохранит в архив с папкой files
Если у вас не работают функции архивации, то либо вы допустили ошибку, либо в хостинге нет поддержки zip архивов. Проверить это можно используя phpinfo(); — если при выводе информации вы найдете категорию zlib, значит функция создания архивов у вас есть.
Разрабатываем новый формат файла для бэкапа сайтов

Сейчас работаю над новым PHP-скриптом, который будет бэкапить не только базу данных, но и все файлы сайта.
Изначально планировалось использовать один из распространённых форматов архивов. В данном случае, первое, что приходит в голову — ZIP и TAR. Для них есть множество готовых классов, а расширение ZIP даже входит в стандартную поставку PHP. Но изучив спецификации форматов, а также опробовал готовые решения, склонился к изобретению своего велосипеда.
Просьба «велосипедохейтеров» воздержаться от комментариев в стиле «хватит нам велосипедов». В конце концов, без создания «велосипедов» не было бы ни Google, ни Google Chrome, ни Facebook, ни WinRAR и 7-Zip.
Почему не TAR?
TAR является наиболее распространенным форматом в unix-системах. И любой админ, не задумываясь, для бэкапа файлов напишет сам или скопирует один из множества готовых скриптов из интернета, которые используют системную программу tar. Но TAR был разработан очень давно, и кроме того, изначально предназначался для создания архивов на ленте. В связи с этим, у него есть следующие недостатки.
Отсутствие индекса
В TAR отсутствует каталог с содержимым архива. Поэтому для просмотра содержимого архива нужно сканировать архив, пройдясь по всем заголовкам файлов. Что на больших архивах может занимать значительное время.
Невозможно использовать смещение (fseek) внутри контейнера
Поскольку TAR не поддерживает сжатия, то его обычно целиком сжимают с помощью gzip или bzip2. В связи с этим, если нужно достать файл из конца архива, то нужно, по сути, распаковать все сжатые данные из архива, пока не дойдем до нужного файла.
Нельзя записывать поток в архив
Так как в TAR в заголовке файла хранится размер файла (без него мы не сможем найти заголовок следующего файла). То мы не можем напрямую в архив писать поток (т.е. еще несуществующий файл, размеры которого вначале неизвестны). Потому при бэкапе того же MySQL, сначала отдельно делают дамп базы, а только потом его вместе с остальными файлами упаковывают в TAR.
Отсутствует контроль целостности файлов
Не хранятся контрольные суммы для файлов.
Почему не ZIP?
ZIP является самым распространенным форматом на Windows, да и, наверное, вообще в мире. Он, как и TAR, является выходцем из 80-х, но при этом последний раз обновлялся в 2007 году. У него есть отсутствующие в TAR индекс, возможность быстро перемещаться по контейнеру, контроль целостности файлов, даже запись потока. Но у него также есть недостатки.
Нет поддержки непрерывных (Solid) архивов
Что весьма плохо сказывается на сжимаемости, когда много мелких файлов.
Время хранится в MS-DOS формате
А это значит, что даты хранятся с точностью до 2 секунд, плюс в случае с PHP это лишние преобразования из unix timestamp в MS-DOS формат и обратно.
Отсутствует шифрование названий файлов в архиве
Шифруется только содержимое файлов, заголовки и центральный каталог в открытом виде.
В принципе недостатки значительно менее существенные, чем у TAR, и я уже собирался использовать ZIP. Но ситуацию омрачал тот факт, что некоторые расширенные возможности (запись потока, unix атрибуты файлов) готовые библиотеки, включая стандартный класс ZipArchive – не поддерживают. А, следовательно, для их поддержки пришлось бы писать свою реализацию ZIP.

В общем, решил рассмотреть другие варианты. После гугления, удалось найти документацию по форматам RAR, 7Z, DAR, ACE, также поковырял немного закрытые CBU и TIB. В процессе закрались мысли о построении собственного велосипеда.
Новый формат файла для бэкапа сайтов
Итак, новый формат (недолго думая он был назван SXB от Sypex Backup) представляет собой компиляцию из идей, подсмотренных в различных форматах плюс несколько своих.
- Блочная дедупликация данных
- Инкрементальный бэкап на блочном уровне
- Сохранение потоков в архив
- Дополнительные типы данных (а не только файлы и каталоги)
- Непрерывный архив
- Наличие индекса
- Быстрый случайный доступ к содержимому
- Может содержать как сжатые, так и не сжатые данные (для плохо сжимаемых файлов, типа фоток, архивов и т.п.)
- Многотомность
- Шифрование, как содержимого, так и заголовков файлов
- Поддержка версионности
- Контроль целостности содержимого
Блочная дедупликация данных
Дедупликация данных – это технология, при помощи которой из архива исключаются повторяющиеся данные, что позволяет уменьшить его размер. Существует дедупликация на уровне файлов и на уровне блоков. В первом случае сравниваются хэши файлов, во втором – хэши отдельных блоков файлов.
Для SXB формата была выбрана блочная дедупликация так как она лучше подходит для бэкапа сайтов. К примеру, это позволяет при инкрементальных бэкапах, постоянно растущих, логов или таблиц БД сохранять их не полностью, а только небольшой блок с добавленными данными.
Сохранение потоков в архив
Эта фича нужна для того, чтобы бэкап MySQL можно было сохранять сразу в архив, без создания временных файлов. Что кроме ускорения работы, уменьшает требования к свободному месту, а также позволяет применять дедупликацию на уровне отдельных таблиц, а не всего SQL-файла.
Дополнительные типы данных
Cложно представить современный сайт не использующий БД. И поскольку разрабатывается новый формат, то возникла идея отойти от стандартного бэкапа MySQL в SQL-файл.
В формат SXB кроме файлов и каталогов, добавлены специальные типы данных для бэкапа БД (структура таблицы, содержимое таблицы, триггеры, функции и т.п.). Структура MySQL объектов будет храниться в виде соответствующих CREATE запросов, а содержимое таблиц — в виде текста с табуляцией в качестве разделителя (такой формат компактнее и позволяет значительно быстрее дампить/восстанавливать данные).
В общем, на этом пока закругляюсь, а то и так уже много написал, если будет интересно могу добавить больше технических подробностей.
А теперь о том, для чего затевалась статья

Хотелось проверить дедупликацию на реальных сайтах. Из тех крупных сайтов, что были под рукой, один на собственном движке (206 МБ), второй на vbulletin (934 МБ), дедупликация показала весьма воодушевляющие результаты.
WinRAR запускался в режиме непрерывный архив (так быстрее и компактнее файл). Для 7-Zip тестировался старый алгоритм LZMA, и новый LZMA2 который загружает все 4 ядра процессора. Использовался PHP 5.4.10 под Win 7 x64.
Да, естественно, при максимальном сжатии WinRAR и 7-Zip покажут более высокое сжатие, но при этом они жрут гигабайты памяти и по полной нагружают все 4 ядра на значительное время. Тягаться по степени сжатия в принципе с ними не нужно, тут немного другая задача. Но то, что php скрипт может показывать близкие результаты к многопоточным сишным программам — вселяет оптимизм.
Желающие помочь в разработке, и кому просто интересно, как много на вашем сайте дубликатов, прошу протестить специальный упрощенный PHP-скриптик.
Интересует количество исключенных дедупликацией данных, размеры и желательно сравнение с другими архиваторами (размер и время, режим, достаточно самый быстрый). В результате выдается вот такая инфа:
dirs 162 files 6811 full_size 206.133 dup_size 28.721 archive_size 152.277 duplicates 3119 bigfiles 477 bf_blocks 5220 bf_dup 316 bf_size 154.426 bf_dup_size 8.027 time 13.53622
