[ロ]APCを使ってPHPを高速化する。

このエントリーをはてなブックマークに追加
はてなブックマーク - [ロ]APCを使ってPHPを高速化する。
Facebook にシェア
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]
[`tweetmeme` not found]

PHPにはAPCAlternative PHP Cache)というPHPスクリプトのコンパイル結果をキャッシュしておくことによって2回目以降のアクセスから処理を高速化することが可能なモジュールがある。このAPCをPEARを使ってインストールする方法を示す。


最近はPHPのMVCフレームワークであるMojavi2で遊んでいたのですが・・・。
ごくごく単純なPHPスクリプトの場合75.48page/sec出るにもかかわらず、
Mojaviをただ使っただけの単純なスクリプトだと、一気に11.65page/secまで
パフォーマンスが落ちることが判明。
計測はローカルマシンから以下の様にやっています。これが正しい計測なのか良くわかりませんが・・・。

$ /usr/local/apache2/bin/ab -n 100 -c 10 http://servername/script_name

APCのインストールとは関係ないけれど、PEARモジュールのアップグレードをしておきましょう。

$ sudo pear upgrade-all
(略)
upgrade-all ok: Archive_Tar 1.3.1
upgrade-all ok: Net_UserAgent_Detect 2.1.0
upgrade-all ok: XML_RPC 1.3.3
upgrade-all ok: Net_Socket 1.0.6
upgrade-all ok: XML_Parser 1.2.6
upgrade-all ok: Mail 1.1.6
upgrade-all ok: DB 1.7.6
upgrade-all ok: HTTP 1.3.6

PEARを使ってAPCのインストールです。以下のコマンドを実行します。

$ sudo pear install apc
/tmp/tmpg1uAwv/APC-3.0.6/configure: line 2835: apxs: command not found

あれれ、「apxs」が無いといわれています。おかしいな、「/usr/local/apache2/bin/apxs」あるのに。
どうやらPATHが通っていないのが原因のようなので以下の様にPATHを通すことに。

$vi ~/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/apache2/bin/
$ source ~/.bash_profile

もういちど。

$ sudo pear install apc
downloading APC-3.0.6.tgz …
(略)
/usr/local/bin/phpize: line 105: aclocal: command not found
`phpize’ failed

今度は、「aclocal」が無いというエラー。
aclocalとは何だろう?調べてみるとどうやら「automake」というパッケージの一部らしい。
別のサーバでautomakeが入っているか確認。

$ rpm -qa | grep automake
automake14-1.4p6-5.1
automake-1.6.3-5
automake15-1.5-6

じゃあ、apt-getでインストールしてみましょう。

$ sudo apt-get install automake
Reading Package Lists… Done
Building Dependency Tree… Done
The following NEW packages will be installed:
automake
0 packages upgraded, 1 newly installed, 0 removed and 0 not upgraded.
Need to get 349kB of archives.
After unpacking 988kB of additional disk space will be used.
Get:1 http://download.fedora.us redhat/9/i386/os automake 1.6.3-5 [349kB]
Fetched 349kB in 2s (140kB/s)
Checking GPG signatures…
Executing RPM (-Uvh)…
Preparing… ########################################### [100%]
1:automake ########################################### [100%]

もう一回APCインストール

$ sudo pear install apc
downloading APC-3.0.6.tgz …
Starting to download APC-3.0.6.tgz (73,416 bytes)
……………..done: 73,416 bytes
35 source files, building
running: phpize
Configuring for:
PHP Api Version: 20020918
Zend Module Api No: 20020429
Zend Extension Api No: 20021010
/usr/local/bin/phpize: line 106: autoconf: command not found
`phpize’ failed

今度は「autoconf」が無いと。

$ sudo apt-get install autoconf
Reading Package Lists… Done
Building Dependency Tree… Done
The following NEW packages will be installed:
autoconf
0 packages upgraded, 1 newly installed, 0 removed and 0 not upgraded.
Need to get 592kB of archives.
After unpacking 1659kB of additional disk space will be used.
Get:1 http://download.fedora.us redhat/9/i386/os autoconf 2.57-3 [592kB]
Fetched 592kB in 2s (241kB/s)
Checking GPG signatures…
Executing RPM (-Uvh)…
Preparing… ########################################### [100%]
1:autoconf ########################################### [100%]

もいっちょ!!

$ sudo pear install apc
downloading APC-3.0.6.tgz …
Starting to download APC-3.0.6.tgz (73,416 bytes)
(略)
Build process completed successfully
Installing ‘/var/tmp/pear-build-root/install-APC-3.0.6//usr/local/lib/
php/extensions/no-debug-non-zts-20020429/apc.so’
install ok: APC 3.0.6

ようやく入りました。
ライブラリが「/usr/local/lib/php/extensions/no-debug-non-zts-20020429/apc.so」というなんかキモイところに入るので、シンボリックリンクを張っておきます。

sudo ln -s /usr/local/lib/php/extensions/no-debug-non-zts-20020429/apc.so /usr/local/lib/php/extensions/

php.iniを以下の様に編集します。

sudo vi /usr/local/lib/php.ini
————————————————–
extension_dir=”/usr/local/lib/php/extensions”
extension=”apc.so”
apc.optimization=1
apc.mode = mmap
apc.cachedir = /tmp
apc.check_compiled_source = 1
apc.check_mtime = 1
————————————————–

ここで注意したいのは、APC で PHP を高速化において、php.iniの設定を以下の様にするようにかかれている所。

————————————————–
zend_extension=”/usr/local/lib/php/extensions/php_apc.so”
apc.mode = mmap
apc.cachedir = /tmp
apc.check_compiled_source = 1
apc.check_mtime = 1
————————————————–

これは現状(PHP4.3.x、PHP4.4.x)では正しくないようである。(過去は正しかった?それも不明。)
zend_extensionではなく、extension_dirとextensionを使おう。
phpinfo();で結果を見ると、「APC」の項目があるのできちんと動いているかすぐわかる。なければどこかおかしいのでもういちど見直そう。Apacheのerrorログや、「php」とコマンドラインで実行するとエラーが出ることがあって原因の特定にはわかりやすいかもしれない。
導入前のMojavi
Requests per second: 11.65 [#/sec] (mean)
導入後のMojavi
Requests per second: 33.30 [#/sec] (mean)
おおお、3倍弱速くなってる!!。効果ありますね。皆さんもぜひぜひ。

Popular Posts:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*