Работа с 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 коды — для опытных