しばらくの間、エクステンションをビルドする方法を解説してきましたが、今回はエクステンションの組み込み状況を確認する方法を紹介します(編集部)
第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()は何の引数も与えずに実行するとすべての情報を表示します。引数を与えることで表示する内容を限定することもできますが、ここではすべて表示しているものとして進めます。最初に確認できるのは、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()では、文字列は表示できますが、配列の内容までは表示できません。
一覧を見ると、指定していないのに有効になっているエクステンションもありますが、それは標準で有効になるものです。何のためのエクステンションなのか、ひととおりマニュアルを確認しておくとよいでしょう。
次回はエクステンションのビルドに戻ります。
Copyright © ITmedia, Inc. All Rights Reserved.