Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2014/12/19

counter hits
since 1999/11/06


XCacheを導入してみる - 第3のキャッシュモジュール

alert[2014/12/11] 2015年1月末をもって本サイトを閉鎖することにしました。Do You PHP?のWebサイト閉鎖とコンテンツ移行についてをご覧ください

PHPで構築されたアプリケーションの高速化には、キャッシュモジュールが半ば必須のような感じになってきていますが、先日まとめたPECLのAPCeAccelerator以外に、ここ最近知られてくるようになったXCacheがあります。2006年11月にGIGAZINEで紹介記事が出たのでご存じの方も多いと思います。

XCacheは、先日まとめたAPCeAcceleratorのように、PHPの中間コードのキャッシュや最適化といった機能を持つ拡張モジュールです。その他の特徴としては、Xdebugのようなカバレッジ機能を持つことが挙げられます。また、APCeAcceleratorと同様にWebインターフェースも用意されています。

サイトのNewsを見てみると、結構頻繁に更新されているようですが、安定性重視で開発が行われているとのことです。また、2006/12/03には1.2.0RC2がリリースされましたが、バージョン1.2.0からPHP5.2.0をフルサポートするようです(1.1.xは一部サポート)。

今回はこのXCache 1.2.0RC2を使って、インストール・設定手順をざっとまとめてみました。

使用した環境

今回の環境は、CentOS4.4+PHP5.2.0です。PHPは以下のようなconfigureオプションを付けてソースからbuildしています。

●PHP5.2.0のconfigureオプション
--with-apxs2=/usr/local/apache2/bin/apxs \
--prefix=/usr/local/lib/php5 \
--with-pear=/usr/local/lib/php5/pear \
--with-config-file-path=/usr/local/lib/php5/ini/5.2.0 \
--with-config-file-scan-dir=/usr/local/lib/php5/ini.d \
--enable-zend-multibyte \
--enable-mbstring \
--enable-mbregex \
--with-dom=shared \
--with-gd=shared \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-ttf \
--with-freetype-dir \
--enable-gd-jis-conv \
--with-xsl=shared \
--with-oci8=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/ \
--with-pdo-oci=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/ \
--with-pdo=shared \
--enable-sockets=shared \
--with-openssl=shared \
--enable-soap=shared \
--enable-sigchild \
--enable-zip=shared \
--enable-curl=shared \
--enable-json=shared

いずれも「--prefix」オプションを付けているため、phpコマンドのパスがデフォルトとは変わっていますが適宜読み替えてください。

インストール

まずはインストールですが、いつもの手順でインストールします。たとえば、カバレッジ機能を有効にする場合は以下の通りとなります。今回はこのオプションを使用しています。

$ tar jxf xcache-1.2.0-rc2.tar.bz2
$ cd xcache
$ phpize
$ ./configure --enable-xcache --enable-xcache-coverager
$ make
$ su -
# make install
#

インストールが終わったら、XCacheのアーカイブに用意されているxcache.iniをphp.iniに追加、もしくはPHPのconfigure時に「--with-config-file-scan-dir」で指定したディレクトリにコピーします。今回は後者の手順を採りました。

●php.iniに追加する場合
# cat xcache.ini >> /path/to/your/php.ini
●--with-config-file-scan-dirで指定したディレクトリにコピーする場合
# cp xcache.ini /path/to/your/scan-dir/

続いて、先のiniファイルを編集します。具体的にはzend_extensionディレクティブで指定しているsoファイルのパスを適宜変更します(推奨)。しかし、試したところ、zend_extensionディレクティブで設定した場合に拡張モジュールがロードされませんでした。ということで、今回は通常のextensionディレクティブを使いました。

●iniファイルの編集
;zend_extension="/usr/local/lib/php5/lib/php/extensions/no-debug-non-zts-20060613/xcache.so"
extension=xcache.so

最後にApacheを再起動し、phpinfoの画面で正しくロードされている事を確認します。

phpinfo画面

基本的な設定項目

基本的にはキャッシュ容量や有効期限、カベージコレクタの設定となります。詳細は、iniファイル内のコメントやXCacheのサイトを参照してください。今回は、次のように設定しました。

●iniファイルの編集
[xcache-common]
;zend_extension="/usr/local/lib/php5/lib/php/extensions/no-debug-non-zts-20060613/xcache.so"
extension = xcache.so

[xcache.admin]
xcache.admin.user = "mOo"
xcache.admin.pass = ""

[xcache]
xcache.shm_scheme =        "mmap"
xcache.size  =                4M
xcache.count =                 2
xcache.slots =                8K
xcache.ttl   =               600
xcache.gc_interval =           0

xcache.var_size  =            2M
xcache.var_count =             1
xcache.var_slots =            8K
xcache.var_ttl   =           600
xcache.var_maxttl   =       3600
xcache.var_gc_interval =     300

xcache.test =                Off

xcache.readonly_protection = Off
xcache.mmap_path =    "/dev/zero"
xcache.coredump_directory =   ""
xcache.cacher =               On
xcache.stat   =               On
xcache.optimizer =           Off

[xcache.coverager]
xcache.coverager =          Off
xcache.coveragedump_directory = ""

XCacheのWebインターフェース

XCacheもAPCeAcceleratorと同様、Webインターフェース(管理画面)が用意されています。アーカイブに含まれるadminディレクトリがそれです。このディレクトリをブラウザからアクセス可能なディレクトリにコピーする。。。だけでは使えませんeAcceleratorのようにiniファイルに設定を追加しないと利用できません。ユーザー名はiniファイルのxcache.admin.userの値をそのまま変更すればいいのですが、パスワードであるxcache.admin.passの値は次のようなPHPスクリプトで値を作成します。

●パスワードのハッシュを生成
$ echo "<?php echo md5('pass'); ?>" | php
1a1dc91c907325c69271ddf0c944bc72
$ 

この値を「xcache.admin.pass」とします。結果、次のような感じになります。

●iniファイルの設定例
[xcache.admin]
xcache.admin.user = "admin"
xcache.admin.pass = "1a1dc91c907325c69271ddf0c944bc72"

iniファイルを編集後Apacheを再起動し、adminディレクトリのindex.phpにアクセスしてみましょう。BASIC認証がかけられていますので、先ほどのユーザーID・パスワードを入力すると次のような画面が表示されるはずです。

Webインターフェース

この画面からキャッシュの状況やクリアなどが行えます。

カバレッジ機能

XCacheの大きな特徴であるカバレッジ機能ですが、こちらもPHPスクリプトとして用意されていますが、デフォルトでは無効になっています。まずは、iniファイルを設定しましょう。

●iniファイルの内容
[xcache.coverager]
xcache.coverager =          On
xcache.coveragedump_directory = "/tmp/pcov"

続いて、xcache.coveragedump_directoryディレクティブで指定したディレクトリを作成し、Apacheの動作ユーザー(httpd.confのUserディレクティブで指定したユーザー)に対して適宜permissionを変更しておきます。

●パスワードのハッシュを生成
# mkdir /tmp/pcov
# chown daemon /tmp/pcov/
# 

そして、アーカイブに含まれるcoveragerディレクトリをadminディレクトリと同様コピーします。Apache再起動後にcoveragerディレクトリのindex.phpにアクセスしてみてください。次のような画面が表示されます。

カバレッジ画面

なお、ディレクトリのリンクをクリックするとドリルダウンしていき、最終的にはすべてのPHPファイルのカバレッジを表示することができます。

カバレッジ画面

この機能、カバレッジテストで重宝するかも知れませんね :-)

実装されていない機能に注意

XCache 1.2.0RC2では、実際には実装されていない機能があります。具体的には、

$ ./configure --help

とすると[N/A]となっているオプションです。これには、optimizerやassembler、encoder/decoderなどが含まれます。実際にコードを追っかけても、からの関数や何もせずreturnとなっていました。この辺は、今後に期待でしょうか。。。

disassemblerについて

「--enable-xcache-disassembler」は有効なオプションですが、1.2.0RC2ではassemblerが無効なので、使い道があるのかどうなのかちょっと疑問です(ペアで使われる関数のハズなので。。。)。ただし、このオプションを付けてconfigureすると、次のように「opcode_spec_def.hがない」というエラーになります。

$ ./configure --enable-xcache \
> --enable-xcache-coverager \
> --enable-xcache-disassembler
                  :
checking if you have opcode_spec_def.h for XCache... no
configure: error: cannot build with disassembler, /usr/local/src/xcache/opcode_spec_def.h required
$ 

調べてみると、prepare.develを使って作成できる事が分かりました。このファイルはXCacheのアーカイブに含まれており、以下の手順で作成可能でした。ただし、作成にはPHPとeAcceleratorのソースコードが必要です。今回は、eAccelerator 0.9.5のソースを使っています。

$ cd xcache
$ cp prepare.devel.inc.example prepare.devel.inc
$ vi prepare.devel.inc
$ cat prepare.devel.inc
# copy this file to devel.prepare.inc before modifying
PHP4_x_DIR=
PHP5_0_DIR=
PHP5_1_DIR=/usr/local/src/php5.2.0
PHP6_x_DIR=

PHP_DEVEL_DIR=/usr/local/src/php5.2.0
$
$ EA_DIR=/path/to/eaccelerator-0.9.5 ./prepare.devel
$ ls opcode_spec_def.h
opcode_spec_def.h
$
$ ./configure --enable-xcache \
> --enable-xcache-coverager \
> --enable-xcache-disassembler
                  :

「--enable-xcache-disassembler」を付けるとxcache_dasm_file関数とxcache_dasm_string関数が有効になります。これらの関数は、アーカイブに含まれるDecompiler.class.phpで使われています。

まとめ

何だか、まとまりきっていない感じですが。。。(^^;

機能的には、やはりAPCeAcceleratorの方が枯れている感じがぬぐえないですね。。。日も浅そうなので、致し方ないところでしょうか。

しかし、Xdebugと機能的に被ってしまいますが、カバレッジ機能はやはりXCacheの大きな特徴ですね。今後の方向性によっては、面白い拡張モジュールになるかも知れません。



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2014 by Hideyuki SHIMOOKA all rights reserved.