SHOEISHA iD

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

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

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

PHPエクステンションのエラー処理

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

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

CMakeを使ってビルドをする

 PHPのエクステンション開発と管理をする際に、configure&makeを使う代わりに、CMakeを使う方法を紹介します。CMake自身はPHPエクステンションをビルドするためだけに用意されたシステムではないので、非常に広範囲のことができますが、今回は、今までの例で作成してきたPHPのエクステンションをCMakeを使ってビルドする方法に限定し、説明を行います。

 これまでのconfigure&makeを使う場合、開発上何が問題点となるでしょうか。

  • ソースが管理されているディレクトリに大量の中間ファイルを作成するので、ソース管理を行う際に必要のないファイルを管理下に入れてしまう
  • ソースを編集する際にも余計なファイルがあるので、そのファイルを見つける際にもストレスが発生する

 しかし、CMakeでビルドする際は、余計なファイルをソース上に展開せずにビルドができるので非常に都合がよいのです。

 CMakeを使っての開発では、以下のような流れで開発をしていきます。

  1. CMakeLists.txtファイルを編集(config.m4の編集に相当します)
  2. ビルド用のフォルダを作成
  3. cmakeコマンドを実行(phpzieとconfigureを行っている操作に相当します)
  4. makeを実行

 このように最初の行程はあまり変わらなく見えますが、CMakeLists.txtファイルを編集しても、大抵は再度makeをすれば問題ありませんので開発がスムーズに行えます。また、config.m4ファイルを使用する場合に比べてその内容もシンプルなので、一度覚えてしまえば、より開発をスムーズに行えることでしょう。

CMakeのインストール

 CMakeはyumを使って簡単にインストールできますので、その方法を紹介します。

YUMを使ってのインストール方法
# yum install cmake

 以上で終了です。MySQLなどをソースからインストールしている場合には、すでにシステム上にCMakeがインストールされている場合もあります。最近はライブラリのビルド方法としてCMakeを利用するケースも増えていますので、さまざまなライブラリをビルドする必要がある場合には、CMakeのビルドシステムについても知っておいて損はないでしょう。

CMakeTexts.txtの作成

 ほかのライブラリに依存しないシンプルな形式のCMakeLists.txtファイルを紹介します。この形が基本になるので、あとはこの形式をもとに変更をしていけば、より複雑なプロジェクトにも対応が可能です。

 下のリストはerrchkという名称でエクステンションを作成するときのサンプルです。これだけの記述で済みますので、非常に見通しが良いことが分かると思います。

ミニマムなCMakeLists.txtの内容
cmake_minimum_required(VERSION 2.6)      // ……(1)
PROJECT(errchk C)                        // ……(2)
include(FindPHP5.cmake)                  // ……(3)

CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake 
               ${CMAKE_CURRENT_BINARY_DIR}/config.h)     // ……(4)
               add_definitions(-DPHP_ATOM_INC -DHAVE_CONFIG_H )         // ……(5)
               
INCLUDE_DIRECTORIES(${PHP5_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}) // ……(6)

ADD_LIBRARY(errchk MODULE errchk.c)                               // ……(7)
SET_TARGET_PROPERTIES(errchk PROPERTIES PREFIX "")                // ……(8)

 FindPHP5.cmakeファイルはインターネット上を検索するといろいろと見つかりますが、今回はサンプルコードに付属しているものを利用する前提です。

  1. CMakeLists.txtファイルのバージョンを指定しています。固定でほぼ問題ありません。
  2. このプロジェクトの名前と使用言語であるC言語を指定しています。ここはプロジェクト名だけが変えれば問題ありません。
  3. FindPHP5.cmakeファイルはPHPのビルドする際の基本的な設定を行います。CMakeではデフォルトでPHP5用の設定がないので、そのファイルを用意する必要があります。
  4. config.hというファイルがコンパイル時に必要になるのですが、通常はconfigureを行った際に作成されるものです。そこで、一度だけconfigureを行い、そのファイルをconfig.h.cmakeという名前にリネームしてそのファイルを利用するように指定します。
  5. ビルド時のオプションを指定します。こちらも通常は固定で問題ありません。
  6. コンパイル時にincludeとして指定するファイルのパスを指定します。こちらも通常は固定で問題ありません。
  7. PHPのエクステンションsoを作るための指定です。モジュール名と、エクステンションで使用するC言語のソースを指定します。
  8. 通常はlib***.soというファイル名でモジュールを作成するのですが、この指定でlibという接頭辞をなくしています。

CMakeでのビルド作業

 CMakeでビルドする際、通常はビルド用のディレクトリを作成するが一般的です。CMakeはビルドに必要な中間ファイルを含めて、そのディレクトリに配下に作成するのであとで削除するのも非常に簡単になります。これが、Automake&Autoconfを用いた既存のPHPのビルド方法と大きく違うところで、開発者にとっては非常に助かります。

 実際にビルドをしてみます。

CMakeでのビルド作業
$ export PATH=/usr/local/php-ext/bin:$PATH   // ……(1)
$ cd errchk                                  // ……(2)
$ mkdir tmp
$ cd tmp
$ cmake ..                                   // ……(3)
$ make

 (1)は、php-configというプログラムを見つけるためにサーチパスを設定しています。先のFindPHP5.cmakeというファイルは、php-configプログラムを使ってビルドする環境を自動的に設定します。従って、ビルドしたい環境を指定するためにもっとも最初に意図したphp-configファイルが見つかるように指定しています。(2)では実際にビルドをするためのディレクトリを作成します。(3)で、1つ上のディレクトリにあるCMakeLists.txtを使ってビルドします。ビルドに成功したら同じディレクトリにerrchk.soが生成されます。

最近のPHPのエクステンションの動向

 PHPのエクステンションは、多くが既存のライブラリのブリッジとして広まってきました。また、これからもその動向は変わらないと思います。しかしながら、PhalconといったZend FrameworkやCakePHPのようなフレームワークの領域までPHPのエクステンションが現れました。そのキャッチコピーには、速度とリソース消費量に利点があると記述されています。PHPのエクステンションを記述していると、PHPとC言語の行き来で非常にたくさんのメモリコピーをしていることは実感します。C言語側で多くの処理ができるようになれば、それらのメモリは必要なくなるのでリソース消費量が少なくなることは納得できます。

 Phalconでは、REST形式でのリクエストに特化したMicroApplicationというフレームワークが用意されており、AjaxやHTML5が普及していく中、PHPもHTMLだけではなくjsonを取得するためのシンプルで軽量なリクエストを大量に受ける必要がでてきた結果だと思います。そのため、このようなPHPのエクステンション形式のフレームワークが需要が出てきているのだと思います。

最後に

 今回で、PHPエクステンション作成の連載は終了ですが、PHPのエクステンションはマニュアルが十分にない中で、どこから手を付けていいのか分からないケースが多々あります。そのような場合に、本連載がその手助けになれば筆者としても大変喜ばしいことです。

 また、最近ではスマートフォンの普及により、マルチプラットフォームでの開発の重要性が高くなってきました。そのような状況の中で、PHPのエンジニアがC言語を身近に感じてもらえる環境としても、エクステンションは非常によいきっかけとも思います。

 なお、筆者はC言語で開発をする際に既存のネイティブライブラリの使い方などを調べる際に、そのライブラリの使い方が今1つ分からない場合、PHPのソースを見てライブラリの使い方を調べることもありました。このようなことができるのはPHPが大変普及しており、また、多くのライブラリをサポートしているからです。PHPのエクステンションが皆様の世界をより広めるきっかけになれば幸いです。

参考資料

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

  • 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/7690 2014/04/04 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング