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



last updated
2006/11/24

counter hits
since 1999/11/06


eAcceleratorを導入してみる - Turck MMCacheの後継

すでにご存じの方も多いですが、サードパーティー製のキャッシュ拡張モジュールであるTurck MMCacheは長い間休止状態にあります。そのTurck MMCacheから分岐したプロジェクトがeAcceleratorです。そのため、eAcceleratorは機能的にもTurck MMCacheと非常によく似ています。

ということで今までまとめてこなかったのですが、2006/10/11にリリースされた0.9.5からちょっと変わってきているので、変更点を中心にざっとまとめてみました。

使用した環境

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

●PHP5.1.6の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.1.6 \
--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-socket=shared \
--enable-openssl=shared \
--enable-soap=shared \
--enable-sigchild
●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コマンドのパスがデフォルトとは変わっていますが適宜読み替えてください。

インストール

まずはインストールですが、以下のようなお決まりの手順でインストールします。2006/11/23現在の最新版はバージョン0.9.5です。

$ tar jxf eaccelerator-0.9.5.tar.bz2
$ cd eaccelerator-0.9.5
$ phpize
$ ./configure --enable-eaccelerator
$ make
$ su -
# make install
#

。。。のハズなんですが、「--enable-eaccelerator」だけだとeAcceleratorのすべての機能を使用することはできません。必要に応じて、その他のオプションを付ける必要があります。

configureオプション 有効になる関数 概要
--enable-eaccelerator _eaccelerator_loader_file, _eaccelerator_loader_line, eaccelerator_cached_scripts, eaccelerator_caching, eaccelerator_clean, eaccelerator_clear, eaccelerator_encode, eaccelerator_info, eaccelerator_list_keys, eaccelerator_load, eaccelerator_optimizer, eaccelerator_purge, eaccelerator_removed_scripts 必要最小限の関数セットを有効にする
--with-eaccelerator-shared-memory eaccelerator_put, eaccelerator_get, eaccelerator_rm, eaccelerator_gc, eaccelerator_lock, eaccelerator_unlock 変数キャッシュを有効にする
--with-eaccelerator-sessions eaccelerator_set_session_handlers(_eaccelerator_session_open, _eaccelerator_session_close, _eaccelerator_session_read, _eaccelerator_session_write, _eaccelerator_session_destroy, _eaccelerator_session_gc) セッションキャッシュを有効にする(PHPでセッションがサポートされていない場合、_eaccelerator_*関数が有効になります)
--with-eaccelerator-content-caching _eaccelerator_output_handler, eaccelerator_cache_page, eaccelerator_rm_page, eaccelerator_cache_output, eaccelerator_cache_result コンテンツキャッシュを有効にする
--with-eaccelerator-disassembler eaccelerator_dasm_file 逆アセンブラを有効にする

ということで、今回のconfigureオプションは以下の通りとしました。

$ ./configure --enable-eaccelerator \
--with-eaccelerator-shared-memory \
--with-eaccelerator-sessions \
--with-eaccelerator-content-caching \
--with-eaccelerator-disassembler
$

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

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

続いて、追加もしくはコピーしたiniファイルを編集します。具体的にはzend_extensionディレクティブで指定しているsoファイルのパスを適宜変更します。

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

もう一つ、iniファイルに記述されたeaccelerator.cache_dirディレクティブで指定されたディレクトリを作成し、Apacheのhttpd.confのUserディレクティブに記載されたユーザーに対して書き込み権限を与えておきます。また、それ以外のユーザーで読み書きできないようにしておきます。

●キャッシュ用ディレクトリの作成
# mkdir /tmp/eaccelerator
# chown daemon /tmp/eaccelerator
# chmod go-rwx /tmp/eaccelerator
#

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

phpinfo画面

設定項目

先ほどのiniファイルにコメントとしてすでに記載されていたり、eAcceleratorのサイトにも説明がありますが、名前が「mmcache」から「eaccelerator」に変わっているだけで、ほとんどTurck MMCacheと同じで、Turck MMCache2.4.6とeAccelerator0.9.5では4項目ほど追加されています。

●iniファイルの内容
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.log_file="/usr/local/apache2/logs/eaccelerator_log"

ここでは、以下のような設定にしています。最後の2つがeAcceleratorから追加された項目です。詳細はeAccelerator settingsのページを参照してください。

  • eaccelerator(eaccelerator.enable)を有効にする
  • オプティマイザ(eaccelerator.optimizer)を有効にする
  • 使用メモリの上限(eaccelerator.shm_size):16MB
  • ディスクキャッシュする際のディレクトリ(eaccelerator.cache_dir):/tmp/eaccelerator
  • PHPファイルの更新チェック(eaccelerator.check_mtime)を有効にする
  • 共有メモリだけにキャッシュ(eaccelerator.eaccelerator.shm_only)しない(ディスクキャッシュも併用する)
  • キャッシュの圧縮(eaccelerator.compress)を有効にする
  • キャッシュの圧縮レベル(eaccelerator.compress_level)を「9」(最大)にする
  • キャッシュログ(eaccelerator.log_file)を/usr/local/apache2/logs/eaccelerator_logとして出力する。指定しない場合は、標準エラー出力(Apache+PHPの場合はerror_log)に出力される

ちなみに、Turck MMCacheと同様、

eaccelerator.shm_only="1"

とした場合、メモリキャッシュのみ有効となり、eaccelerator.cache_dirで指定したディレクトリにキャッシュ用のディレクトリやキャッシュファイルは作成されません。

eAcceleratorのWebインターフェース

さて、eAccelerator0.9.5でハマったのがWebインターフェース(管理画面)です。0.9.5から大きく変更されており、mmcache関数(Turck MMCacheの管理画面を表示する関数)に相当していたeaccelerator関数が廃止されました。それに代わって、control.phpが提供されるようになりました。このファイルはeAcceleratorのアーカイブに含まれています。

このcontrol.phpですが、iniファイルに設定を追加しないと利用できません。

●iniファイルの設定例
  eaccelerator.allowed_admin_path="/home/shimooka/public_html/ea/"

この設定はphp.iniのopen_basedirディレクティブと同じ要領で指定します。

また、BASIC認証がかけられていますが、ユーザーID・パスワードはcontrol.phpに記載されていますので、実運用で利用する場合は必ず変更が必要です。

Webインターフェースの見た目や使い勝手は、Turck MMCacheや0.9.5以前のeAcceleratorとさほど変わりません。また、PHPで実装されていることから、eAcceleratorで提供されている関数の使い方のサンプルになるでしょう。

キャッシュキーの名前空間

eAcceleratorでは、eaccelerator.name_spaceディレクティブを使って、キャッシュキーに名前空間を指定できるようになっています。これはVirtualHost毎に指定することが可能で、デフォルト値は「""」(空文字)です。eAccelerator settingsのページには、「デフォルトの名前空間としてVirtualHostで指定したServerNameが使用される」とありますが、うまくServerNameを拾えていないようでした(eaccelerator.cの2126行目にあるPHP_RINIT_FUNCTION関数で利用するホスト名を初期化している模様で、_SERVER["SERVER_NAME"]の値を使おうとしているみたいです)。この結果、私の環境(Apache2.0.59/2.2.3+PHP5.1.6/5.2.0の4通り)では、何も指定しないとすべてのVirtualHostで同じキャッシュを扱うという動作をしました。うーむ。。。

後述しますが、VirtualHost毎に別の名前空間を指定することで、同じキー名でも別々の値を扱うことができることは確認できました。

また、eAccelerator settingsのページには「.htaccessでも設定可能」みたいなことが書いてありますが、0.9.5のソース(eaccelerator.c)を見た限り、PHP_INI_SYSTEMとして定義されていますので、httpd.confもしくはphp.iniでの指定となります。httpd.confで指定する場合、以下のようになります。

●VirtualHostの設定例
NameVirtualHost *:80

<VirtualHost *:80>
    ServerAdmin shimooka@doyouphp.jp
    DocumentRoot /home/shimooka/public_html
    ServerName vhost1
    ErrorLog logs/vhost1-error_log
    CustomLog logs/vhost1-access_log common
    php_admin_value eaccelerator.name_space "vhost1"
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin shimooka@doyouphp.jp
    DocumentRoot /var/www/html
    ServerName vhost2
    ErrorLog logs/vhost2-error_log
    CustomLog logs/vhost2-access_log common
    php_admin_value eaccelerator.name_space "vhost2"
</VirtualHost>

設定前と設定後で、以下のようなスクリプトを各VirtualHostで実行すると、動作の違いが分かると思います。

●vhost1で実行するスクリプト
<?php
eaccelerator_put(1, 'aaa');
var_dump(eaccelerator_get('1'));    // 名前空間を指定後は、'aaa'が返る
  
●vhost2で実行するスクリプト
<?php
eaccelerator_put(1, 'xyz');
var_dump(eaccelerator_get('1'));    // 名前空間を指定後は、'xyz'が返る
  

ただし、この設定を行った場合、0.9.5では以下のようなコードが書けませんでした。

●名前空間を使用すると期待した動作をしないスクリプト
<?php
foreach (eaccelerator_list_keys() as $key) {
    var_dump(eaccelerator_get($key['name']));
}
  

名前空間が空文字であれば設定したキー名そのものが返ってきますが、名前空間を使用した場合、キー名($key['name'])の前に「:」が付いてしまいます

ちょっとインチキ臭いですが、cache.cに次のパッチを当てると期待通りの動作をしますが、名前空間を指定しないVirtualHostでeaccelerator_list_keys関数を使用した場合に、名前空間を持つキー名がおかしくなってしまいます(^^;

●とりあえずのパッチ
*** cache.c.org 2006-11-24 00:00:44.000000000 +0900
--- cache.c     2006-11-24 00:00:49.000000000 +0900
***************
*** 625,632 ****
                  ALLOC_INIT_ZVAL(list);
                  array_init(list);

!                 if (strlen(p->key) > xlen) {
!                     add_assoc_string(list, "name", (p->key) + xlen, 1);
                  } else {
                      add_assoc_string(list, "name", p->key, 1);
                  }
--- 625,632 ----
                  ALLOC_INIT_ZVAL(list);
                  array_init(list);

!                 if (strlen(p->key) > xlen + 1) {
!                     add_assoc_string(list, "name", (p->key) + xlen + 1, 1);
                  } else {
                      add_assoc_string(list, "name", p->key, 1);
                  }
  

また、eAccelerator0.9.6-devをsvnからcheckoutして同様に試してみましたが、まだ直っていないようですね。。。この機能って、あまり使われてないのかな。。。

とりあえずのまとめ

「Turck MMCacheと似てるから、さらっとまとめられるかな」と思っていたeAcceleratorですが、掘り下げていくとエライことになってしまいました(^^;

今回は、機能が分割されていたのが一番の不意打ちでした。でも、必要な機能だけコンパイルできるのは良いですね。

名前空間は現時点での動作が微妙ですが、面白い使い方ができそうな感じです。



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