Работа с zip архивами в PHP: запаковка и распаковка файлов
Когда необходимо программно запаковать файлы в zip архив, используйте модуль — ZipArchive, который установлен практически на всех серверах вместе с PHP.
Для работы с модулем, используется одноименный класс – ZipArchive.
Запаковка файлов в zip
Пример показывает как запаковать все папки, подпапки и файлы в них с помощью ZipArchive.
/** * Create zip archive from specified folder. * * @param $source * @param $destination * @param bool $include_sourse * * @return string * * @ver 0.1 (kama) */ function zip_folder( $source, $destination, $include_sourse = true ){ $source = str_replace( '\\', '/', rtrim( realpath( $source ), '/' ) ); if( ! file_exists( $source ) ) return 'Error: file not exists'; $zip = new ZipArchive(); if( ! $zip->open( $destination, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE ) ) return 'Error: ZipArchive not installed'; if( $include_sourse ) $zip->addEmptyDir( basename($source) ); if( is_file( $source ) ){ $zip->addFile( $source ); } elseif( is_dir( $source ) ){ foreach( new RecursiveIteratorIterator( new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST ) as $file_path => $file_obj ){ // Ignore . | .. folders if( preg_match('~/[.]{1,2}$~', $file_path) ) continue; $file_rel_path = str_replace( "$source/", '', $file_path ); if( $include_sourse ) $file_rel_path = basename($source) .'/'. $file_rel_path; if( is_dir( $file_path ) ){ $zip->addEmptyDir( $file_rel_path ); } elseif( is_file( $file_path ) ){ $zip->addFile( $file_path, $file_rel_path ); } } } $zip->close(); return 'Done'; }
Использвоание:
$source = __DIR__ . '/wp-content'; $destination = __DIR__ . '/_'. basename($source) .'-'. date( 'd-m-Y' ) . '.zip'; echo zip_folder( $source, $destination );
Распаковка файлов из zip
Теперь, пример распаковки zip архива с помощью ZipArchive.
function unzip_file( $file_path, $dest ){ $zip = new ZipArchive; if( ! is_dir($dest) ) return 'Нет папки, куда распаковывать...'; // открываем архив if( true === $zip->open($file_path) ) { $zip->extractTo( $dest ); $zip->close(); return true; } else return 'Произошла ошибка при распаковке архива'; } // использование $zipfile = 'test.zip'; // путь до файла архива $pathdir = 'test/'; // путь к папке, в которую будет распакован архив $done = unzip_file( $zipfile, $pathdir ); if( is_string($done) ){ echo 'Ошибка: '. $done; }
В WordPress для распаковки архивов есть специальные функция (работают только в админке) unzip_file()
—
Эта заметка встроена в: Полезные PHP коды — для опытных