連載
» 2011年12月01日 00時00分 UPDATE

仕事で使える魔法のLAMP(33):PHPエクステンション組み込みの仕上げ

PHPエクステンションの解説は今回でひとまずおしまいです。前回までに紹介できなかったものの中から、とても役に立つエクステンションを紹介します(編集部)

[山口晴広,株式会社イメージズ・アンド・ワーズ]

画像を生成するならGDエクステンション

 第28回から、多くの開発者が利用するPHPエクステンションを有効にしていく作業を進めてきました。エクステンションについての解説は今回でおしまいです。

 毎回テーマを決めてエクステンションを紹介してきましたが、今回は最後ということで、残ったエクステンションから重要なものをいくつか紹介します。1つ目は、画像生成のためのライブラリであるGDを使うためのエクステンションです。GDを使うと、アプリケーションに画像のリサイズやグラフ作成などの描画機能を持たせることができます。

 GDエクステンションの利用頻度はかなり高いと言えます。必須のエクステンションと言ってもいいでしょう。なお、こういった画像生成や画像操作のライブラリは他にもありますが、ほとんどの開発者がGDを利用しています。

 まずは、GDエクステンション関係のヘルプを見てみましょう。

(略)
  --with-gd[=DIR]         Include GD support.  DIR is the GD library base
                          install directory [BUNDLED]
  --with-jpeg-dir[=DIR]     GD: Set the path to libjpeg install prefix
  --with-png-dir[=DIR]      GD: Set the path to libpng install prefix
  --with-zlib-dir[=DIR]     GD: Set the path to libz install prefix
  --with-xpm-dir[=DIR]      GD: Set the path to libXpm install prefix
  --with-freetype-dir[=DIR] GD: Set the path to FreeType 2 install prefix
  --with-t1lib[=DIR]        GD: Include T1lib support. T1lib version >= 5.0.0 required
  --enable-gd-native-ttf    GD: Enable TrueType string function
  --enable-gd-jis-conv      GD: Enable JIS-mapped Japanese font support
(略)

 「--with-gd」でGDエクステンションを有効にできるということが分かりますが、他にも指定できる項目があることが分かります。これは、一部の画像形式やフォントの取り扱いは、GDではなくさらに外部のライブラリを使うためです。GDはそもそもGIF形式の画像を扱うためのライブラリであり、JPEGなどを扱うときは他のライブラリの助けを得ているのです(JPEGならlibjpeg。PNGならlibpngなど)。

 ヘルプを見ると、GDはPHPに付属していることが分かります。さらにPHPのドキュメントサイトをみると、付属のものを利用することを推奨していますので、今回は付属のものを使うことにします。付属のGDをビルドするには、libjpegとlibpngが必要ともあります。JPEGやPNGといった画像形式は利用頻度が高いので、付属のものを使わない場合であっても有効にするべきでしょう。

 フォントを扱うFreeType 2もよく利用します。これも追加しましょう。libzは圧縮のためのライブラリで、すでに第30回で追加しています。PHPのconfigureスクリプトでは、このようにまったく同じ引数が別のエクステンションに関連してヘルプに現れることがありますので注意しましょう。

 それでは必要なパッケージをインストールしましょう。libjpeg、libpng、FreeType 2の開発用パッケージを、次のようにしてインストールします。GDの開発用パッケージはインストールしません。

$ sudo yum install libjpeg-devel libpng-devel freetype-devel

 PHPのconfigureスクリプトの引数には、次の記述を追加します。

  --with-gd 
  --with-jpeg-dir=/usr 
  --with-png-dir=/usr 
  --with-freetype-dir=/usr 
  --enable-gd-native-ttf 
  --enable-gd-jis-conv 

 PHP付属のものを利用しますので、「--with-gd」には何も指定しません。本連載では、Linuxにおいてプログラムをインストールする標準的な場所である「/usr」を明示してきました。この指定は省略可能ですが、あえてすべてを明示するようにしておいたので、「--with-gd」が付属のものを使う指示ということが、すぐに見て取れるようになります。

 仮に「/usr」の指定を省略してしまうと、「--with-gd」でPHP付属のものを使っているということが、非常に分かりにくくなります。省略せずに明示することで、後からこのコマンドラインを見ても誤解を招く可能性が低くなるのです。

 ビルド、インストールできたら、第31回で紹介した方法でGDエクステンションの状況を確認してみましょう。

gd
 
GD Support => enabled
GD Version => bundled (2.0.34 compatible)
FreeType Support => enabled
FreeType Linkage => with freetype
FreeType Version => 2.2.1
GIF Read Support => enabled
GIF Create Support => enabled
JPEG Support => enabled
libJPEG Version => 6b
PNG Support => enabled
libPNG Version => 1.2.10
WBMP Support => enabled
XBM Support => enabled
JIS-mapped Japanese Font Support => enabled
 
Directive => Local Value => Master Value
gd.jpeg_ignore_warning => 0 => 0

 GDエクステンションが有効になっており、なおかつPHP付属のバージョンが使われていることが読み取れます。また、JPEGやPNGにも対応していることも確認できます。

PHPでもSSLを利用するために

 本連載でApache HTTP Server(以下Apache)のビルド手順を解説したときに、SSLを有効にしています(第16回)。SSLのために、OpenSSLという外部ソフトウェアを利用しました。

 PHPからもOpenSSLを利用できるようにする、OpenSSLエクステンションがあります。これを利用すると、OpenSSLの機能をPHPから利用できます。ApacheですでにOpenSSLとリンクしていますので、ついでにPHPでも使うことにしましょう。次のコマンドラインを追加します。

  --with-openssl=/usr 

 なお、sslというキーワードでconfigureのヘルプを検索すると、上記以外に次の引数があることが分かります。

(略)
  --enable-ftp            Enable FTP support
  --with-openssl-dir[=DIR]  FTP: openssl install prefix
(略)
  --with-imap[=DIR]       Include IMAP support. DIR is the c-client install prefix
  --with-kerberos[=DIR]     IMAP: Include Kerberos support. DIR is the Kerberos
install prefix
  --with-imap-ssl[=DIR]     IMAP: Include SSL support. DIR is the OpenSSL install prefix
(略)
  --with-snmp[=DIR]       Include SNMP support
  --with-openssl-dir[=DIR]  SNMP: openssl install prefix
  --enable-ucd-snmp-hack    SNMP: Enable UCD SNMP hack
(略)

 FTP、IMAP(サーバサイドにあるメールボックスにアクセスするためのプロトコル)、SNMP(ネットワーク機器などの管理情報を取得するためのプロトコル)のエクステンションに関連する引数として、「--with-openssl-dir[=DIR]」「--with-imap-ssl[=DIR]」「--with-openssl-dir[=DIR]」という引数があります。

 いずれもネットワークプロトコルを扱うエクステンションであり、それぞれのプロトコルでSSLを利用したいときにこの引数を使います。OpenSSLエクステンションとは別に指定しなければなりませんので、これらのエクステンションを有効にするときは留意してください。

phpMyAdminのユーザー認証に必要なmcrypto

 暗号関連のエクステンションとしては、mcryptというエクステンションが有名です。その名の通り、mcryptという暗号ライブラリを利用するためのエクステンションです。

 PHP+MySQLの環境では、ほぼ間違いなく使うことになるソフトウェアにphpMyAdminがあります。PHPで書かれたMySQLの管理ツールで、Webブラウザから利用できます。データベースのデータの表示や操作といった機能を持っています。phpMyAdminではユーザー認証の方式がいくつか選べるのですが、そのうちの1つはmcryptエクステンションが必要になります。ここでmcryptもインストールしておきましょう。

 まず、mcryptの開発パッケージをインストールします。

$ sudo yum install libmcrypt-devel

 configureに追加するコマンドラインは次のようになります。

  --with-mcrypt=/usr

精密な数値演算のために

 小数の数値計算を実行すると、誤差が発生することがあります。これは、どのプログラミング言語を使っても大体同じことです。インタラクティブシェルモードで次のように計算式を実行すると、おかしな結果が返ってきます。ここで実行しているのは、0.8を10倍したうえで、整数(int)に変換するというものです。

$ /opt/php-5.3.8/bin/php -a
 
php > echo (int) (0.8 * 10);
8
php > echo (int) ((0.1+0.7) * 10);
7

 8という結果が期待されるところですが、0.8を0.1+0.7と表現すると、結果がおかしなことになります。コンピュータは小数を扱うときに、内部的には整数同様に2進数で扱います。しかし2進数で少数を表すときは、精度に限界があります。文字列から2進数に変換すると、誤差が発生することがあるのです。この例では、誤差が表面化してしまい、正しい結果が得られなくなっています。

 多くの場合、こういった誤差は注意して計算していれば許容できるものですので、これを現実的な解としています。しかし、科学計算などでは計算を繰り返すことで誤差が積み重なり、その結果が現実と大きくずれてしまうということがあります。

 誤差を許さない状況では、小数の精度を管理しながら数値計算をしなければなりません。こういった要求に応えるのが、数値計算用のライブラリです。PHPではいくつかの数値計算用ライブラリが利用できますが、BC Mathエクステンションは外部ソフトウェアが不要で、configureに指定するだけですぐ利用できます。そのため、多くの開発者がPHPアプリケーションで利用しています。

 BC Mathを有効にするには、configureの引数に次の行を追加します。

  --enable-bcmath

configureスクリプトはこうなる

 ここまでの内容をまとめます。まずはパッケージのインストールコマンドです。最後の2行が今回追加した内容です。

$ sudo yum install zlib-devel openssl-devel db4-devel pcre-devel
$ sudo yum install libicu-devel gettext-devel
$ sudo yum install readline-devel libxml2-devel libxslt-devel
$ sudo yum install libjpeg-devel libpng-devel freetype-devel
$ sudo yum install libmcrypt-devel

 PHPのconfigureスクリプトは次のようになります。

./configure 
  --prefix=/opt/php-5.3.8 
  --with-apxs2=/opt/apache-httpd-2.2.21/bin/apxs 
  --enable-mbstring 
  --enable-intl 
  --with-icu-dir=/usr 
  --with-gettext=/usr 
  --with-pcre-regex=/usr 
  --with-pcre-dir=/usr 
  --with-readline=/usr 
  --with-libxml-dir=/usr/bin/xml2-config 
  --enable-soap 
  --enable-wddx 
  --with-xmlrpc 
  --with-xsl=/usr 
  --with-mysql=mysqlnd 
  --with-mysqli=mysqlnd 
  --with-pdo-mysql=mysqlnd 
  --with-zlib=/usr 
  --with-zlib-dir=/usr 
  --enable-dba 
  --with-db4=/usr 
  --with-gd 
  --with-jpeg-dir=/usr 
  --with-png-dir=/usr 
  --with-freetype-dir=/usr 
  --enable-gd-native-ttf 
  --enable-gd-jis-conv 
  --with-openssl=/usr 
  --with-mcrypt=/usr 
  --enable-bcmath 
  2>&1 | tee configure_log.txt

 まだ利用頻度が高そうなエクステンションはいくつありますが、エクステンションについてはここまでとします。次回からは、PHPをApacheに組み込む方法を解説します。

著者紹介

株式会社イメージズ・アンド・ワーズ
代表取締役
山口晴広(やまぐち はるひろ)



「仕事で使える魔法のLAMP」バックナンバー

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。