make is.dev make it simple. development.
2024年9月12日

PHPでZip解凍(ZipArchive編)

ZipArchive を使ってZipファイルを解凍してみる。

使用環境

・ Amazon Linux 2
・ PHP 8.2.9

事前準備

PHPでZipがサポートされていない場合、ZipArchive が使えない。
エラーが出る場合は、php.ini等でサポートを有効化しておく。
(有効化の仕方は環境によるが、php.iniの末尾や設定ファイルに以下を追記する等)

; Enable zip extension module
extension=zip
/etc/php.d/20-zip.ini

基本サンプル

Zipファイルを指定したフォルダに全展開するサンプル。

<?php

// インスタンス生成
$zip = new ZipArchive;

// ZipファイルをOpen
$result = $zip->open( 'sample.zip' );

if ( $result === TRUE ) {

    // 解凍する
    if ( ! $zip->extractTo( './' ) ) {
        // error
    }

    $zip->close();

} else {
    // error
}
PHP

open() の返り値は成功時はtrueだが、失敗時はエラーコード(数値)が返るので注意が必要。
(結果判定はtrueを明確に判定しないとおかしくなる)

extractTo() が実際の解凍処理で、解答先のパスを引数で指定する。
成功時はtrue。
失敗時はfalseが返るが、失敗時もフォルダなど一部だけ解凍されるケースがあるので注意が必要。

指定したファイルだけ解凍する

指定したファイルだけ解凍する場合、第2引数でファイルを指定出来る。
複数ファイルを指定したい場合は、配列で指定すればOK。

    // 1ファイルを指定して解凍する
    if ( ! $zip->extractTo( './', 'sample.txt' ) ) {
        // error
    }

    // 複数ファイルを指定して解凍する
    if ( ! $zip->extractTo( './', [ 'sample/sample1.txt', 'sample/sample2.txt' ] ) ) {
        // error
    }
PHP

パスワード付きZipファイルの解凍

パスワードがある場合は、解凍前にパスワードを指定すればOK。

<?php

// インスタンス生成
$zip = new ZipArchive;

// ZipファイルをOpen
$result = $zip->open( 'sample.zip' );

if ( $result === TRUE ) {

    // 解凍パスワードを指定
    $zip->setPassword( 'password' );

    // 解凍する
    if ( ! $zip->extractTo( './' ) ) {
        // error
    }

    $zip->close();

} else {
    // error
}
PHP