この拡張モジュールにより、ZIP 圧縮されたアーカイブとその内部のファイルに対する透過的な読み書きが可能となります。
PHP 4 に同梱されているバージョンは、Guido Draheim 氏による
ZZIPlib バージョン 0.10.6
以降を必要とします。
この拡張モジュールは、Jean-loup Gailly 氏と Mark Adler
氏による zlib
の機能を利用します。
注意:
PHP 4.1.0 以前の Zip サポートは実験的なものです。
警告 |
PHP 4 の zip 拡張モジュールはメンテナンスされていませんので、
私たちはバンドルされているものよりも PECL
拡張モジュールの利用を推奨します。
|
これらの関数を使用するには、zip サポートを有効にして PHP
をコンパイルしなければなりません。そのためには、設定オプション
--with-zip[=DIR]
を使用します。
[DIR] は、ZZIPlib
ライブラリのインストールされている場所です。
Windows ユーザは、これらの関数を使用するために php.ini
内の php_zip.dll を有効にする必要があります。
これらの関数を利用するには、設定オプション
--enable-zip
を使用して
zip サポートを有効にして PHP をコンパイルしなければなりません。
Windows ユーザは、これらの関数を使用するために php.ini
内の php_zip.dll を有効にする必要があります。
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);
} ?>
|
|