対象読者
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ファイルをクローズします。
