CLXXIX. Zip ファイル関数

導入

このモジュールにより、ZIP 圧縮されたアーカイブとその内部のファイルに対する 透過的な読み書きが可能となります。

要件

PHP 4 の同梱版

最初のバージョンは PHP 4 に同梱されています。また、PECL でバージョン 1.0 として公開されています。 http://pecl.php.net/package/zip を参照ください。 これは、Zip アーカイブの読み込みのみに対応しています。

このバージョンは、Guido Draheim による ZZIPlib ライブラリの関数を使用しています。 ZZIPlib バージョン >= 0.10.6 が必要です。

PECL 版および PHP 5.2 以降の版

最新のバージョンは PHP 5.2.0 以降に同梱されており、 PECL 版のバージョン 1.1.0 以降となっています。これは、 外部のライブラリを必要としません。PHP 5.1 以降で使用した場合には Zip アーカイブの読み書きが可能で、PHP 4 で使用した場合には 読み込みのみが可能となります。

インストール手順

この PECL 拡張 モジュールは PHP にバンドルされていません。 この PECL 拡張モジュールをインストールする方法は、 マニュアルの PECL 拡張モジュールのインストール という章にあります。 新規リリース・ダウンロード・ソースファイル・管理者情報・CHANGELOG といった関連する情報については、次の場所にあります。 http://pecl.php.net/package/zip.

Linux でのインストール

PHP 4 の同梱版のインストール

これらの関数を使用するには、zip サポートを有効にして PHP をコンパイルしなければなりません。そのためには、設定オプション --with-zip[=DIR] を使用します。 [DIR] は、ZZIPlib ライブラリのインストールされている場所です。

PECL 版あるいは PHP 5.2 以降のバージョンの同梱版のインストール

これらの関数を使用するには、zip サポートを有効にして PHP をコンパイルしなければなりません。そのためには、設定オプション --enable-zip を使用します。 これは外部のライブラリを必要としません。

注意: PECL 版を PHP 4 で使用することもできます。そのためには、 同梱版の zip 拡張モジュールを無効にするか、あるいは zip サポートを無効にして PHP を再コンパイルする必要があります。

Windows でのインストール

PHP 4 の同梱版のインストール

Windows ユーザは、php.iniphp_zip.dll を有効にすると、 これらの関数を使用できるようになります。 PHP 4 の場合、この DLL は PHP の Windows ダウンロードバイナリの extensions/ ディレクトリ にあります。 この PECL 拡張モジュール の DLL PHP ダウンロード ページ または http://snaps.php.net/ からダウンロードできます。

注意: Zip のサポートは、PHP 4.1.0 以前は実験的なものでした。 この節に書かれている内容は、PHP 4.1.0 以降の Zip 拡張モジュールに関するものです。

PECL 版あるいは PHP 5.2 以降のバージョンの同梱版のインストール

Windows ユーザは、php.iniphp_zip.dll を有効にすると、 これらの関数を使用できるようになります。 PHP 4 の場合、この DLL は PHP の Windows ダウンロードバイナリの extensions/ ディレクトリ にあります。 この PECL 拡張モジュール の DLL PHP ダウンロード ページ または http://snaps.php.net/ からダウンロードできます。

実行時設定

設定ディレクティブは定義されていません。

リソース型

Zip モジュールでは二種類のリソース型が使用されます。 まず最初が Zip アーカイブを表す Zip directory で、 もうひとつはアーカイブのエントリを表す Zip Entry です。

定義済み定数

以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。

ZipArchive はクラス定数を使用します。定数には フラグ (FL_)、エラー (ER_) あるいはモード (接頭辞なし) の三種類があります。

ZIPARCHIVE::CREATE (integer)

アーカイブが存在しない場合に、作成します。

ZIPARCHIVE::OVERWRITE (integer)

常に新しいアーカイブを開始します。このモードは、 ファイルが既に存在する場合にはそれを上書きします。

ZIPARCHIVE::EXCL (integer)

アーカイブが既に存在する場合はエラーとします。

ZIPARCHIVE::CHECKCONS (integer)

アーカイブの一貫性チェックを別途行い、 失敗した場合はエラーとします。

ZIPARCHIVE::FL_NOCASE (integer)

名前で検索する際に大文字小文字を区別しません。

ZIPARCHIVE::FL_NODIR (integer)

ディレクトリ要素を無視します。

ZIPARCHIVE::FL_COMPRESSED (integer)

圧縮されたデータを読み込みます。

ZIPARCHIVE::FL_UNCHANGED (integer)

元のデータを使用し、変更内容を無視します。

ZIPARCHIVE::CM_DEFAULT (integer)

圧縮あるいは保存のどちらか有効なほうを実行します。

ZIPARCHIVE::CM_STORE (integer)

保存します (圧縮しません)。

ZIPARCHIVE::CM_SHRINK (integer)

圧縮します。

ZIPARCHIVE::CM_REDUCE_1 (integer)

reduced with factor 1

ZIPARCHIVE::CM_REDUCE_2 (integer)

reduced with factor 2

ZIPARCHIVE::CM_REDUCE_3 (integer)

reduced with factor 3

ZIPARCHIVE::CM_REDUCE_4 (integer)

reduced with factor 4

ZIPARCHIVE::CM_IMPLODE (integer)

imploded

ZIPARCHIVE::CM_DEFLATE (integer)

deflated

ZIPARCHIVE::CM_DEFLATE64 (integer)

deflate64

ZIPARCHIVE::CM_PKWARE_IMPLODE (integer)

PKWARE 方式。

ZIPARCHIVE::CM_BZIP2 (integer)

BZIP2 アルゴリズム。

ZIPARCHIVE::ER_OK (integer)

エラーはありません。

ZIPARCHIVE::ER_MULTIDISK (integer)

複数ディスクの zip アーカイブはサポートされません。

ZIPARCHIVE::ER_RENAME (integer)

一時ファイルの名前変更に失敗しました。

ZIPARCHIVE::ER_CLOSE (integer)

zip アーカイブのクローズに失敗しました。

ZIPARCHIVE::ER_SEEK (integer)

シークエラー。

ZIPARCHIVE::ER_READ (integer)

読み込みエラー。

ZIPARCHIVE::ER_WRITE (integer)

書き込みエラー。

ZIPARCHIVE::ER_CRC (integer)

CRC エラー。

ZIPARCHIVE::ER_ZIPCLOSED (integer)

zip アーカイブはクローズされました。

ZIPARCHIVE::ER_NOENT (integer)

そのファイルはありません。

ZIPARCHIVE::ER_EXISTS (integer)

ファイルが既に存在します。

ZIPARCHIVE::ER_OPEN (integer)

ファイルをオープンできません。

ZIPARCHIVE::ER_TMPOPEN (integer)

一時ファイルの作成に失敗しました。

ZIPARCHIVE::ER_ZLIB (integer)

Zlib エラー。

ZIPARCHIVE::ER_MEMORY (integer)

メモリの確保に失敗しました。

ZIPARCHIVE::ER_CHANGED (string)

エントリが変更されました。

ZIPARCHIVE::ER_COMPNOTSUPP (integer)

圧縮方式がサポートされていません。

ZIPARCHIVE::ER_EOF (integer)

予期せぬ EOF です。

ZIPARCHIVE::ER_INVAL (integer)

無効な引数です。

ZIPARCHIVE::ER_NOZIP (integer)

zip アーカイブではありません。

ZIPARCHIVE::ER_INTERNAL (integer)

内部エラー。

ZIPARCHIVE::ER_INCONS (integer)

矛盾した Zip アーカイブです。

ZIPARCHIVE::ER_REMOVE (integer)

ファイルを削除できません。

ZIPARCHIVE::ER_DELETED (integer)

エントリが削除されました。

例 1. Zip アーカイブの作成

<?php

$zip
= new ZipArchive();
$filename = "./test112.zip";

if (
$zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
    exit(
"cannot open <$filename>\n");
}

$zip->addFromString("testfilephp.txt" . time(), "#1 This is a test string added as testfilephp.txt.\n");
$zip->addFromString("testfilephp2.txt" . time(), "#2 This is a test string added as testfilephp2.txt.\n");
$zip->addFile($thisdir . "/too.php","/testfromfile.php");
echo
"numfiles: " . $zip->numFiles . "\n";
echo
"status:" . $zip->status . "\n";
$zip->close();
?>

例 2. アーカイブの詳細の出力および一覧表示

<?php
$za
= new ZipArchive();

$za->open('test_with_comment.zip');
print_r($za);
var_dump($za);
echo
"numFiles: " . $za->numFiles . "\n";
echo
"status: " . $za->status  . "\n";
echo
"statusSys: " . $za->statusSys . "\n";
echo
"filename: " . $za->filename . "\n";
echo
"comment: " . $za->comment . "\n";

for (
$i=0; $i<$za->numFiles;$i++) {
    echo
"index: $i\n";
    
print_r($za->statIndex($i));
}
echo
"numFile:" . $za->numFiles . "\n";
?>

例 3. Zip ストリームラッパーによる OpenOffice メタ情報の読み込み

<?php
$reader
= new XMLReader();

$reader->open('zip://' . dirname(__FILE__) . '/test.odt#meta.xml');
$odt_meta = array();
while (
$reader->read()) {
    if (
$reader->nodeType == XMLREADER::ELEMENT) {
        
$elm = $reader->name;
    } else {
        if (
$reader->nodeType == XMLREADER::END_ELEMENT && $reader->name == 'office:meta') {
            break;
        }
        if (!
trim($reader->value)) {
            continue;
        }
        
$odt_meta[$elm] = $reader->value;
    }
}
print_r($odt_meta);
?>

この例は旧 API (PHP 4 用) を使用します。まず ZIP ファイルアーカイブをオープンし、アーカイブ内の各ファイルを読み込み、 その内容を出力します。この例で使用するアーカイブ test2.zip は、ZZIPlib のソース配布物に含まれているテスト用アーカイブのひとつです。

例 4. Zip の使用例

<?php

$zip
= zip_open("/tmp/test2.zip");

if (
$zip) {
    while (
$zip_entry = zip_read($zip)) {
        echo
"Name:               " . zip_entry_name($zip_entry) . "\n";
        echo
"Actual Filesize:    " . zip_entry_filesize($zip_entry) . "\n";
        echo
"Compressed Size:    " . zip_entry_compressedsize($zip_entry) . "\n";
        echo
"Compression Method: " . zip_entry_compressionmethod($zip_entry) . "\n";

        if (
zip_entry_open($zip, $zip_entry, "r")) {
            echo
"File Contents:\n";
            
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
            echo
"$buf\n";

            
zip_entry_close($zip_entry);
        }
        echo
"\n";

    }

    
zip_close($zip);

}
?>
目次
zip_close -- ZIP ファイルアーカイブを閉じる
zip_entry_close -- ディレクトリエントリを閉じる
zip_entry_compressedsize -- ディレクトリエントリの圧縮時のサイズを取得する
zip_entry_compressionmethod -- ディレクトリエントリの圧縮方法を取得する
zip_entry_filesize -- ディレクトリエントリの実際のファイルサイズを取得する
zip_entry_name -- ディレクトリエントリの名前を取得する
zip_entry_open -- 読込み用にディレクトリエントリをオープンする
zip_entry_read -- オープンされたディレクトリエントリから読み込む
zip_open -- Zip ファイルアーカイブをオープンする
zip_read -- Zip ファイルアーカイブの中の次のエントリを読み込む
ZipArchive::addFile -- 指定したパスからファイルを ZIP アーカイブに追加する
ZipArchive::addFromString -- その内容を指定して、ファイルを ZIP アーカイブに追加する
ZipArchive::close -- アクティブな (オープンされた、あるいは新しく作成された) アーカイブを閉じる
ZipArchive::deleteIndex -- インデックスを使用して、アーカイブ内のエントリを削除する
ZipArchive::deleteName -- 名前を使用して、アーカイブからエントリを削除する
ZipArchive::extractTo -- アーカイブの内容を展開する
ZipArchive::getArchiveComment -- ZIP アーカイブのコメントを返す
ZipArchive::getCommentIndex -- エントリのインデックスを使用して、エントリのコメントを返す
ZipArchive::getCommentName -- エントリ名を使用して、エントリのコメントを返す
ZipArchive::getFromIndex -- インデックスを使用して、エントリの内容を返す
ZipArchive::getFromName -- 名前を使用して、エントリの内容を返す
ZipArchive::getNameIndex -- インデックスを使用して、エントリの名前を返す
ZipArchive::getStream -- 名前を使用して、エントリのファイルハンドラ (読み込み専用) を取得する
ZipArchive::locateName -- アーカイブ内のエントリのインデックスを返す
ZipArchive::open -- ZIP ファイルアーカイブをオープンする
ZipArchive::renameIndex -- インデックスを使用してエントリ名を変更する
ZipArchive::renameName -- 名前を使用してエントリ名を変更する
ZipArchive::setArchiveComment -- ZIP アーカイブのコメントを設定する
ZipArchive::setCommentIndex -- インデックスを使用してエントリのコメントを設定する
ZipArchive::setCommentName -- 名前を使用してエントリのコメントを設定する
ZipArchive::statIndex -- インデックスを使用してエントリの詳細を取得する
ZipArchive::statName -- 名前を使用してエントリの詳細を取得する
ZipArchive::unchangeAll -- アーカイブに対するすべての変更を取り消す
ZipArchive::unchangeArchive -- アーカイブ全体に対して行われたすべての変更を取り消す
ZipArchive::unchangeIndex -- 指定したインデックスのエントリに対するすべての変更を取り消す
ZipArchive::unchangeName -- 指定した名前のエントリに対するすべての変更を取り消す