エクステンションの組み込み状況を確認する仕事で使える魔法のLAMP(31)

しばらくの間、エクステンションをビルドする方法を解説してきましたが、今回はエクステンションの組み込み状況を確認する方法を紹介します(編集部)

» 2011年11月18日 00時00分 公開
[山口晴広株式会社イメージズ・アンド・ワーズ]

PHPの関数で状況を確認

 第28回から、よく使われるPHPのエクステンションを有効にしていく作業を進めています。しばらくエクステンションのビルドが続きましたので、今回はちょっと趣向を変えて、ビルドしたエクステンションがきちんと組み込まれているのかを確認する方法を紹介します。

 しかし、まだエクステンションをビルドしてPHPに組み込む方法を解説しているところです。Apache HTTP Server(以下Apache)でPHPを使えるようにはしていません。Apacheを使えるようになると、WebブラウザからPHPに命令を出すことができますが、まだその手段は使えません。そこで、第29回で紹介したインタラクティブシェルを利用します。

 まずは、インタラクティブシェルモードでPHPを起動します。以下のようにコマンドを入力して実行してください。

$ /opt/php-5.3.8/bin/php -a
Interactive shell
 
php >

 プロンプトが出てきたら、「phpinfo();」と入力します。セミコロンまできちんと入力するよう注意してください。セミコロンの入力を忘れて[Enter]を押してしまったときは、次のプロンプトでセミコロンだけ入力して[Enter]を押してください。セミコロンまで入力したところで実行されます。

 「phpinfo()」はPHPの関数です。実行するとPHPのバージョン情報や、configureスクリプトで指定した引数などの情報を以下のように表示します。

php > phpinfo();
phpinfo()
PHP Version => 5.3.8
 
System => Linux www3026ub.sakura.ne.jp 2.6.18-274.3.1.el5 #1 SMP Tue Sep 6 20:13:52 EDT 2011 x86_64
Build Date => Nov 10 2011 08:36:29
Configure Command =>  './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'
Server API => Command Line Interface
Virtual Directory Support => disabled
Configuration File (php.ini) Path => /opt/php-5.3.8/lib
Loaded Configuration File => (none)
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)
PHP API => 20090626
PHP Extension => 20090626
Zend Extension => 220090626
Zend Extension Build => API220090626,NTS
PHP Extension Build => API20090626,NTS
Debug Build => no
Thread Safety => disabled
(以下略)

 実際にphpinfo()を実行すると、かなりの量の情報を出力します。出力を1画面ごとに表示させるlessなどのページャ(出力結果のうち、表示したい部分に自由に移動することを可能にするツール)を使わないと、全体を把握するのは難しいでしょう。しかし、本稿執筆時点で最新バージョンのPHP 5.3系では、インタラクティブシェルでページャを使うことができません。そこでインタラクティブシェルを起動せずに、次のようにコマンドを実行します。

$ /opt/php-5.3.8/bin/php -r 'phpinfo();' | less

 インタラクティブシェルを使わずに、PHPスクリプトを実行するには、上記のように引数で「-r」を指定します。このほかに、PHPスクリプトを標準入力に与える、ファイルにスクリプトを格納して、ファイル名を指定するなどの方法があります。標準入力を利用するときは、次のようにコマンドを実行します。前後にPHPスクリプトの始まりと終わりを示す「<?php 〜 ?>」が必要です。

$ echo '<?php phpinfo(); ?>' | /opt/php-5.3.8/bin/php | less

 なお、phpinfo()で得られる情報に限れば、次のように引数に「-i」を指定してコマンドを実行しても同じ情報が得られます。

$ /opt/php-5.3.8/bin/php -i | less

 phpinfo()は、Apacheに組み込んだ状態で実行すると、結果をHTML形式で出力するので、Webブラウザで結果を見ることができます。HTML形式の出力は一見すると見やすいですが、テキストにして保存したり、コピー&ペーストには向きません。コマンドラインで得られる出力と使い分けるのがよいでしょう。ちなみに、RC版(リリース候補版)が出ているPHP 5.4以降なら、インタラクティブシェルでページャが使えるようになります。

phpinfo()の出力を解読する

 それでは、phpinfo()を実行して得られた情報を解読していきましょう。

 先に示したように、phpinfo()は何の引数も与えずに実行するとすべての情報を表示します。引数を与えることで表示する内容を限定することもできますが、ここではすべて表示しているものとして進めます。最初に確認できるのは、PHPのバージョンなど、現在実行しているPHPの情報です。

 次はPHPの実行時設定です。各行左から、設定項目の名前、ローカルの値、マスターの値の順で表示します。マスターの値とは、設定ファイルで設定した値か、初期値を意味します。一方、ローカルの値はPHPプログラムから設定した値です。

Core
 
PHP Version => 5.3.8
 
Directive => Local Value => Master Value
allow_call_time_pass_reference => On => On
allow_url_fopen => On => On
allow_url_include => Off => Off
always_populate_raw_post_data => Off => Off
arg_separator.input => & => &
arg_separator.output => & => &
asp_tags => Off => Off
auto_append_file => no value => no value
auto_globals_jit => On => On
auto_prepend_file => no value => no value
browscap => no value => no value
default_charset => no value => no value
default_mimetype => text/html => text/html
define_syslog_variables => Off => Off
disable_classes => no value => no value
(以下略)

 その次はエクステンションの情報と、エクステンションの実行時設定の情報です。エクステンションごとにアルファベット順に表示します。ほとんどの場合、この部分が大量の出力になります。以下はmbstringエクステンションの例です。

mbstring
 
Multibyte Support => enabled
Multibyte string engine => libmbfl
HTTP input encoding translation => disabled
 
mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser General Public License version 2.1.
 
Multibyte (japanese) regex support => enabled
Multibyte regex (oniguruma) backtrack check => On
Multibyte regex (oniguruma) version => 4.7.1
 
Directive => Local Value => Master Value
mbstring.detect_order => no value => no value
mbstring.encoding_translation => Off => Off
mbstring.func_overload => 0 => 0
mbstring.http_input => pass => pass
mbstring.http_output => pass => pass
mbstring.http_output_conv_mimetypes => ^(text/|application/xhtml\+xml) => ^(text/|application/xhtml\+xml)
mbstring.internal_encoding => no value => no value
(以下略)

 エクステンションによっては、実行時の設定項目がないものもあります。設定がないエクステンションの部分はエクステンションの情報のみの表示となります。エクステンションの情報としては、エクステンションが有効かどうかということと、外部ソフトウェアのバージョンなどが表示されます。

 エクステンションの情報の後には、環境変数と、PHP内であらかじめ設定する変数の一覧とその値が出力されます。こちらは主に開発者がデバッグのために参照するものです。最後に、PHPのライセンス情報が表示されます。

 エクステンションが期待通りにビルドできているかどうかを確認するには、先に挙げたエクステンションの情報を見ればよいということになります。有効にしたエクステンションが表示されていること、ビルド時のエクステンションの設定が正しいかどうかということが主な確認事項です。

前回ビルドした結果を確認

 では、前回ビルドした結果を確認してみましょう。前回有効にしたMySQL関係を例に見ていきます。lessの検索機能でMySQLを検索してください。MySQLエクステンション関連の設定は以下のようになっているはずです。

mysql
 
MySQL Support => enabled
Active Persistent Links => 0
Active Links => 0
Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735 $
 
Directive => Local Value => Master Value
mysql.allow_local_infile => On => On
mysql.allow_persistent => On => On
mysql.connect_timeout => 60 => 60
mysql.default_host => no value => no value
mysql.default_password => no value => no value
mysql.default_port => no value => no value
mysql.default_socket => no value => no value
mysql.default_user => no value => no value
mysql.max_links => Unlimited => Unlimited
mysql.max_persistent => Unlimited => Unlimited
mysql.trace_mode => Off => Off

 「MySQL Support => enabled」となっているので、エクステンションが有効になっていることが分かります。また、「Client API version => mysqlnd 5.0.8-dev(以下略)」で、クライアントライブラリとしてmysqlndを使っていることも読み取れます。つまり指定した通りにビルドできていることになります。mysqliエクステンションについても同様に確認できます。

 次にPDOの設定です。

PDO
 
PDO support => enabled
PDO drivers => mysql, sqlite, sqlite2
 
pdo_mysql
 
PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735 $
 
Directive => Local Value => Master Value
pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock
 
pdo_sqlite
 
PDO Driver for SQLite 3.x => enabled
SQLite Library => 3.7.7.1

 PDOはさまざまなデータベースクライアントを抽象化するエクステンションで、前回はMySQLを有効にしました。また、標準状態でPHPに付属するSQLiteが有効になります。「PDO drivers => mysql, sqlite, sqlite2」と表示されていることから、正しくビルドできていると判断できます。なお、SQLiteのPDOドライバがsqliteとsqlite2と2つありますが、sqlite2は旧バージョンとの互換性を維持するためのものです。ドライバの実体はどちらも同じです。

 PDOに続いて、PDOのドライバの状態が表示されています。ここでもmysqlndがクライアントライブラリになっていることが確認できます。SQLiteの方に目を向けると、PHPに付属しているSQLiteのバージョンが3.7.7.1だということも分かります。ちなみにこれはPHP 5.3.8リリース時の最新バージョンです。

エクステンションを一覧する

 phpinfo()の出力はあまりに長いのですが、エクステンションの一覧だけを確認したいということもあります。このようなときは、get_loaded_extensions()関数を使います。ただ、これはphpinfo()のように結果を出力する関数ではありません。一覧を配列として返しますので、別途、表示方法を指示する必要があります。インタラクティブシェルでは、次のようにprint_r()関数を使うとよいでしょう。

php > print_r(get_loaded_extensions());
Array
(
    [0] => Core
    [1] => date
    [2] => ereg
    [3] => libxml
    [4] => pcre
    [5] => sqlite3
    [6] => zlib
    [7] => ctype
    [8] => dom
(以下略)

 print_r()を使うと、いろいろな型の変数の内容を表示できます。覚えておきましょう。ただのprint()では、文字列は表示できますが、配列の内容までは表示できません。

 一覧を見ると、指定していないのに有効になっているエクステンションもありますが、それは標準で有効になるものです。何のためのエクステンションなのか、ひととおりマニュアルを確認しておくとよいでしょう。

 次回はエクステンションのビルドに戻ります。

著者紹介

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



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

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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