SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

PHPエクステンションの作り方

PHPで外部ライブラリ(libzip)を組み込んで利用する

PHPエクステンションの作り方 第5回

  • X ポスト
  • このエントリーをはてなブックマークに追加

 本連載では、PHPエクステンションの作成方法を紹介します。前回は、PHPエクステンションを利用してクラスを作成する方法を紹介しました。今回はそのクラスを利用し、また、外部のネイティブライブラリを使用してクラスのメソッドを実装します。また、その開発時に必要になる応用を紹介します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

対象読者

 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から以下のように使われることを想定します。

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

次のページ
libzipの組み込み

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
PHPエクステンションの作り方連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7524 2013/12/20 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング