Недавно пришлось писать скрипт, который должен архивировать папку с проектом, выгружать его по FTP и там разархивировать. Задачка оказалась не совсем простой, в полной версии скрипта происходит исключение списка файлов и папок типа .git и всего того что не должно попасть на хостинг, минификация и конкатенация js и т.д., но тут я пока оставлю пару заметок о самом zip в php и как им пользоваться, а чуть позже затрону тему FTP и возможно выложу допиленый скрипт для деплоя с помощью одного только PHP.
Итак, простой скрипт, при запуске которого в архив попадают все файлы (рекурсивно) находящиеся в той-же папке где и сам скрипт.
ZIP-архивирование папки с помощью PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?php function ZipDirectory($src_dir, $zip, $dir_in_archive='') { $src_dir = str_replace("\\","/",$src_dir); $dir_in_archive = str_replace("\\","/",$dir_in_archive); $dirHandle = opendir($src_dir); while (false !== ($file = readdir($dirHandle))) { if (($file != '.')&&($file != '..')) { if (!is_dir($src_dir.$file)) { $zip->addFile($src_dir.$file, $dir_in_archive.$file); } else { $zip->addEmptyDir($dir_in_archive.$file); $zip = ZipDirectory($src_dir.$file.DIRECTORY_SEPARATOR,$zip,$dir_in_archive.$file.DIRECTORY_SEPARATOR); } } } return $zip; } function ZipFull($src_dir, $archive_path) { $zip = new ZipArchive(); if($zip->open($archive_path, ZIPARCHIVE::CREATE) !== true) { return false; } $zip = ZipDirectory($src_dir,$zip); $zip->close(); return true; } # Использование if(ZipFull('./','./deploy.zip')) { echo 'Archive created.'; } else { die('Error.'); } |
В общем это всё что нужно для архивирования, всё остальное можно перепилить на собственное усмотрение на что следует обратит внимание, вот эти строки:
1 2 |
$src_dir = str_replace("\\","/",$src_dir); $dir_in_archive = str_replace("\\","/",$dir_in_archive); |
вроде топорно так, но без замены слэша может произойти печалька, особенно если запаковывать на машине windows, а распаковывать на *nix.