対象読者
PHPでの基本構文を理解している方で、PHPエクステンションに興味がある方、さらに深くPHPを知りたい方で、C言語の基本的な構文を理解している方を対象としています。
必要な環境
この記事では、PHP 5.4を使用し、Linux環境で確認を行っています。インストール方法は初回を参照してください。
作成するサンプルの概要
今回作成するサンプルは、前回の『PHPエクステンションでクラスを作成する』で作成したサンプルを元に、実際にzipファイルの中身を読むサンプルを作成します。それらのサンプルを通じて、以下のことを紹介します。
- 外部ライブラリ(今回はlibzip)を組み込む方法
- クラスのメソッドで、引数と戻り値にクラスのインスタンスを利用する方法
- データの読込をphpのストリームを通じて行う方法
モジュールを構成するソース一覧
今回のサンプルモジュールを構成するソースは以下のようになっており、前回のサンプルからpzip_stream.cファイルが追加されています。
ソース名 |
PHP上の クラス名 |
説明 |
---|---|---|
php_pzip.h | -- | ヘッダファイル |
pzip.c | -- |
モジュール全体のファイル (前回のサンプルと変わりありません) |
pzip_file.c | PZipFile | ZIPファイル全体を扱うためのクラスを実装するソース |
pzip_entry.c | PZipEntry | ZIPファイル内の一つのエントリーを扱うためのクラスを実装するソース |
pzip_stream.c | -- |
ZIPファイル内の一つのファイルデータを扱うための PHPストリームを実装するためのソース |
PHPでの利用イメージ
今回のサンプルコードは、ZIPファイルの読み込みのみであり、書き込みや変更などは考慮せずに、PHPから以下のように使われることを想定します。
$zip_file = new PZipFile(); $ok = $zip_file->open("sample/test2.zip"); // ……(1) if($ok){ $zip_file->setPassword("abcdefg"); // ……(2) $num = $zip_file->numChildren(); // ……(3) for($i = 0; $i < $num; $i++){ // ZipEntryクラスがリターンされる $entry = $pzip_file->getEntry($i); // ……(4) $info = $entry->getStat(); // ……(5) $fp = $pzip_file->getStream($entry); // ……(6) if($fp){ $data = fread($fp,$info['size']); // ……(7) print $data; fclose($fp); } } $zip_file->close(); // ……(8) }
以下のような流れで利用します。
(1)ZIPファイルをオープンします。
(2)ZIPファイルの解凍時のパスワードを設定します。
(3)ZIPファイル内のエントリー数を取得します。
(4)エントリーを管理するクラス(PZipEntry)のインスタンスを取得します。
(5)エントリーの詳細を取得します。詳細は配列で取得します(ZipArchive::statIndexと同様の結果)。
(6)エントリーのファイルをオープンします。
(7)ファイルを読み込みます。
(8)ZIPファイルをクローズします。