APCでPHPの処理を高速化
Category
Server
PHPの処理を高速化したい場合、PHPアクセレーターの導入が効果的です。
PHPアクセレーターには、有名なものとしてAPCやeAccelerator等があります。
今回の記事では、APCの導入手順について紹介しようと思います。
Keyword:PHPアクセレーター,最適化,キャッシュ
PHPアクセレーターAPCとは?
PHPアクセレーターとは、PHPのスクリプトを最適化してコンパイルされた状態でデータをキャッシュし、以後同じデータにアクセスがあった際、そのキャッシュを利用することでスクリプトの実行速度を高速化させるためのものです。
今回紹介するAPC(Alternative PHP Cache)はPECLの拡張モジュールです。
PECLで提供されているモジュールはCで記述されているため、PHPで記述されたPEARのライブラリよりも高速に動作すると言われています。
また、PEARライブラリはPHPのバージョンアップに伴う再インストールが原則不要ですが、PECLの拡張モジュールはPHP内部のAPIに依存するため、PHPのバージョンアップに伴いAPIが変更された場合、再コンパイルが必要です。
PECLの拡張モジュールのインストールには、PEARの”pearコマンド”と同様に”peclコマンド”が用意されており、インストール方法もPEARのライブラリと同じようにすることが可能ですが、”インストール後、設定ファイル(php.ini等)にextensionでインストールしたモジュールを指定する必要がある”といった違いがあります。
[参考サイト]
⇒ PECL -The PHP Extension Community Library-
[2013.3.23追記]
yumを使ってインストールするともっと簡単です。
・”2.APCをインストールする”から始める
・pecl install apc → yum install php-pecl-apc
これで”php-pearも依存関係にあるので一緒にインストールしますか?”と聞かれるので、一緒にインストールします(※OSのバージョンや既にインストールしているパッケージとの依存関係にもよりますので、環境に合わせて使い分けてみてください)。
あとは、同じ操作でOKです!
APCのインストールと設定
1.APCをインストールするための準備をする
APCをインストールするには、peclコマンドを使用します。
peclコマンドを使用するには、依存関係にある以下のパッケージが必要です。
ない場合はインストールしてくだい。
※PHP5.3系での説明です
※PHP5.1.6や外部リポジトリを使用している場合”53″を外してください
※CentOS 5系での説明です。6系の場合、上記に追記した手順を推奨します。
コマンド
# php-pearをインストール yum install php-pear # php53-devel(phpize)をインストール yum install php53-devel # httpd-devel(apxs)をインストール yum install httpd-devel # pcre-develをインストール yum install pcre-devel
補足
●php-pearをインストール
peclコマンドを使用するのに必要です。
●php53-devel(phpize)をインストール
デフォルトのリポジトリを使用し、PHP5.3環境でphpizeをインストールするには、”php-devel”ではなく”php53-devel”をインストールします(※“php-devel”では”Erro:php53-common conflicts with php-common”といったようにコンフリクトエラーが出力されてしまいます)。
●httpd-devel(apxs)をインストール
apxsが必要ですので、httpd-develもインストールします。
●pcre-develをインストール
pcre-develもインストールしてください。
2.APCをインストールする
peclコマンドを使ってAPCをインストールします。
コマンド
# APCをインストール pecl install apc # 上から順番に以下が表示されます Enable internal debugging in APC [no] : Enable per request file info about files used from the APC cache [no] : Enable spin locks (EXPERIMENTAL) [no] : Enable memory protection (EXPERIMENTAL) [no] : Enable pthread mutexes (default) [yes] : Enable pthread read/write locks (EXPERIMENTAL) [no] : # APCをアップデート pecl upgrade apc # APCのバージョンを確認 pecl list
補足
●APCをインストール
peclコマンドを使ってAPCをインストールします。
●上から順番に以下が表示されます
デフォルト設定で問題ありませんので、全ての項目に対してEnterキーを入力します。
●APCをアップデート
APCをアップデートする場合はこちらのコマンドを入力します。
●APCのバージョンを確認
APCのバージョンを確認します。
※2012.6.12現在の最新バージョンは、Ver 3.1.9です。
3.APCコンソールの設定
APCには、Webインターフェースのコンソールが用意されています。
コンソールでは、キャッシュの使用率やキャッシュされたファイルの一覧を確認したり、キャッシュのクリアが行えるようになっています。また、PHPの画像処理ライブリであるGDがインストールされていれば、視覚でも分りやすいグラフ表示での確認も可能です。
以下コマンドを使って、コンソールの設定をします。
コマンド
# APCコンソールの設定 cd /ドキュメントルートのパス/ mkdir ●●●●● cp /usr/share/pear/apc.php /ドキュメントルートのパス/●●●●●/○○○○○.php vi /ドキュメントルートのパス/●●●●●/○○○○○.php # コンソールの認証を使用しない defaults('USE_AUTHENTICATION',0); # コンソールの認証を使用する場合はユーザー名とパスワードを設定 defaults('ADMIN_USERNAME','ユーザー名'); defaults('ADMIN_PASSWORD','パスワード');
補足
●APCコンソールの設定
APCの参考サイト等では、スクリプトのapc.phpをコピーし、ドキュメントルート上に配置するように説明されていますが、ブラウザでアクセス可能なツールを説明通り配置するのも不安です…(※“ドメイン/apc.phpでアクセス可能”というのは、周知されていますので、アクセス先を任意のものに変更)。ですから、ドキュメントルート上に任意のディレクトリを作成し、その中にapc.phpをコピーした任意のファイルを作成します。
2行目のcdコマンドでドキュメントルートに移動します。
3行目のmkdirコマンドでディレクトリを作成します。
※●●●●●にディレクトリ名を入力します。
4行目のcpコマンドでapc.phpをコピーし、作成したディレクトリ内に任意のファイルを作成します。
※○○○○○.phpの○の箇所にファイル名を入力します。
5行目のviコマンドでそのファイルを開きます。
※このファイルに認証設定をします。
これで、APCコンソールにアクセスする際のURLは、以下のようになります。
http://www.ドメイン/●●●●●/○○○○○.php
●コンソールの認証を使用しない
APCのコンソールに認証機能は付いているのですが、一部の項目を見る時にだけ認証するようになっています(※ほとんどの項目は認証なしに見れてしまいます…)。
ですから、コンソールの認証は使用しないようにします。
viコマンドで○○○○○.phpを開き、8行目のように認証しない設定”0″に変更します(※デフォルトでは、認証する設定”1”になっています)。
コンソールの認証を使用する場合は、認証する設定”1”にし、反転表示されている10~12行目と同じ箇所を○○○○○.phpから探し、ユーザー名とパスワードを設定します。
4.APCコンソールにDigest認証を設定する
コンソールの認証では不安ですので、別途Digest認証を設定します。
Digest認証とは?
Digest認証とは、Apacheによる認証方式で、MD5ハッシュでパスワードを暗号化しますので、Basic認証よりは安全な認証方式と言えます(※Apache2以上で使用可能です)。
Basic認証は、パスワードを暗号化せず送信しますので、パケットを傍受されてしまうと比較的簡単にパスワードが分かってしまいます(※共に、より安全な認証を行いたいのであれば、SSLと併用で使用することが望ましいのは言うまでもありません)。
Digest認証を使用するには、digestモジュールを有効化し、.htccess(もしくはhttpd.conf)と.htdigestで設定します。
httpd.conf
# httpd.confを編集 vi /etc/httpd/conf/httpd.conf # digestモジュールを有効化 LoadModule auth_digest_module modules/mod_auth_digest.so # 設定を反映させるためApacheを再起動 /etc/rc.d/init.d/httpd restart
.htaccess(もしくはhttpd.conf)
# Digest認証設定 AuthType Digest AuthName "レルム" AuthDigestDomain /認証を効かせるディレクトリ/ AuthUserFile /.htdigestを置くディレクトリ/.htdigest require valid-user # ブラウザからの.htdigestと.htaccessのアクセスを拒否 <Files ~ "^.(htdigest|htaccess)$"> order deny,allow deny from all </Files> # httpd.confで".ht"で始まるファイルのアクセスを拒否してもOK <Files ~ "^\.ht"> order deny,allow deny from all </Files> # User-Agentの文字列に"MSIE"を含む場合、環境変数AuthDigestEnableQueryStringHackにOnをセット BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
.htdigest
# .htdigest作成コマンド(新規) htdigest -c /.htdigestを置くディレクトリ/.htdigest 'レルム' ユーザー名 # .htdigestパスワード変更コマンド htdigest /.htdigestを置くディレクトリ/.htdigest 'レルム' ユーザー名 # 以下が表示されるので、パスワードを指定 Adding password for ユーザー名 in realm レルム. New password: Re-type new password: # .htdigestに出力される内容 ユーザー名:レルム:暗号化されたパスワード
補足
◇httpd.conf
●httpd.confを編集
viコマンドでhttpd.confを開きます。
●digestモジュールを有効化
コメントアウト(#)を外し、digestモジュールを有効化します。
●設定を反映させるためApacheを再起動
設定を反映させるためApacheを再起動します。
◇.htaccess(もしくはhttpd.conf)
●Digest認証設定
“レルム”には、ログイン画面に表示されるメッセージを入力します。
例) administrator only
“AuthDigestDomain”には、認証を効かせたいディレクトリをドキュメントルート以下から指定します。
“AuthUserFile”には、.htdigestを置くディレクトリをサーバーパスで指定します。
ブラウザからのアクセスも禁止しますが、ドキュメントルートよりも上の階層に置いておいてもよいですね。
※Apache2.2より”AuthUserFile”に変更されています。
●ブラウザからの.htdigestと.htaccessのアクセスを拒否
ブラウザ経由でのアクセスで.htdigestと.htaccessを見れないようにします。
●httpd.confで”.ht”で始まるファイルのアクセスを拒否してもOK
httpd.confで設定しておくと楽ですね。
●User-Agentの文字列に”MSIE”を含む場合、環境変数AuthDigestEnableQueryStringHackにOnをセット
IE6のバグ対策です。
◇.htdigest
●.htdigest作成コマンド(新規)
新規に.htdigestを作成するコマンドです。
“.htdigestを置くディレクトリ”と”レルム”は、.htaccess(もしくはhttpd.conf)と同じものを指定し、ユーザー名は任意のものを入力します。
●.htdigestパスワード変更コマンド
.htdigestのパスワード変更コマンドです。
●以下が表示されるので、パスワードを指定
パスワードを入力します(2回)。
●.htdigestに出力される内容
.htdigestには、コロン区切りで”ユーザー名”と”レルム”と”暗号化されたパスワード”が出力されます。
httpd.confで設定した場合、Apacheの再起動もお忘れなく!
▼APCのコンソール
5.iniファイルの作成
iniファイルを作成し、APCの設定を行います。
コマンド
# iniファイルの作成 vi /etc/php.d/apc.ini # apc.iniに以下を追記 extension = apc.so apc.enabled = 1 apc.shm_size = 128M apc.ttl = 3600 apc.user_ttl = 3600 apc.gc_ttl = 7200 apc.stat = 1 # 設定を反映させるためApacheを再起動 /etc/rc.d/init.d/httpd restart # APCの設定確認 php -r "phpinfo();" | grep apc
補足
●iniファイルの作成
新規にapc.iniファイルを作成していますが、php.iniに設定を追加しても構いません。
●apc.iniに以下を追記
extension = apc.so
エクステンションを追加。
apc.enabled = 1
APCの有効(1)無効(0)
apc.shm_size = 128M
APCに割り当てる共有メモリサイズ。
apc.ttl = 3600
キャッシュエントリが他のエントリに割り当てられるまでスロットに残っている秒数。設定した秒数でAPCが期限切れのキャッシュを削除します。0にすると、キャッシュの中身が古いエントリでいっぱいになってしまった場合、新しいエントリがキャッシュできなくなります。その場合、キャッシュが使用可能メモリを超えてしまった時点でキャッシュを完全に破棄します。”0″にした場合、ヒット効率が悪くなりますので、設定しておいた方がよいですね。
apc.user_ttl = 3600
ユーザーキャッシュエントリが他のエントリに割り当てられるまでスロットに残っている秒数。設定した秒数でAPCが期限切れのキャッシュを削除します。0にすると、キャッシュの中身が古いエントリでいっぱいになってしまった場合、新しいエントリがキャッシュできなくなります。その場合、キャッシュが使用可能メモリを超えてしまった時点でキャッシュを完全に破棄します。”0″にした場合、ヒット効率が悪くなりますので、設定しておいた方がよいですね。
apc.gc_ttl = 7200
キャッシュエントリがガベージコレクションのリストに残り続ける秒数。ソースファイルのキャッシュ中にサーバープロセスが止まってしまった場合の安全装置です。ソースファイルが変更された場合、メモリに割り当てられている古いバージョンは、設定された秒数に達するまで再読み込みされません。0にすると無効になります。
apc.stat = 1
ファイルが変更されているかどうかスクリプトの実行の度にAPCが調べ、変更されていれば、再コンパイルし新しいバージョンをキャッシュします。”1″で有効、”0″で無効設定となります。無効設定の場合、パフォーマンスを向上させることはできますが、変更されているかどうかのチェックは行いません。要するに、変更内容を有効にする場合、サーバーの再起動が必要となります。
●設定を反映させるためApacheを再起動
APCの設定を反映させるため、Apacheを再起動します。
●APCの設定確認
APCの設定を確認するコマンドです。
phpinfoをサーバーにアップロードし、確認しても構いません。
この場合、info.php等を作成し以下を記述します。
<?php phpinfo(); ?>
※PHPの設定が表示されますので、”APC”の設定を確認します。
[参考サイト]
APCの実行設定
※こちらのサイトでデフォルト値等も確認できます。
APCの有無で効果を測定する
APCの有無で(設定を有効・無効にして)効果を測定してみましょう。
ベンチマークを取るため、ApacheBenchで処理速度を計測します。
以下コマンドを入力します。
コマンド
# ApacheBenchで処理速度を計測 ab -n 100 -c 10 http://webcreator-net.com/
補足
●ApacheBenchで処理速度を計測
例では、10件の同時接続を100件実行し、処理速度を計測します。
apc.iniで設定を有効と無効に変更し、それぞれの数値を計測します(※設定反映ごとにApacheを再起動します)。
URLの箇所には、自分のサイトのURLを入力してください。
●確認項目
Time taken for tests:リクエスト完了までの所要時間
Complete requests:総リクエスト数
Failed requests:失敗したリクエスト数
Requests per second:1秒間に処理出来るリクエスト数
Time per request:1リクエスト当たりの平均処理時間
当環境では、リクエスト完了までの所要時間が22秒短くなり、1秒間に処理出来るリクエスト数が7件増加していました。その結果、APCを無効にした場合と比べて、約3倍処理速度が向上していました(※2012.7.1再計測)。今回の場合、”10件の同時接続を100件実行”しましたので、それほど負荷をかけて計測したわけではありません。サーバーのスペックや自分のサイトのアクセス数も踏まえた上で数値を変更してみてください。
また、失敗したリクスト数が多い場合、サーバーの処理能力を超えてしまっている場合がありますので、実環境に合わせた負荷をかけるようにしたり、場合によっては、サーバー環境を見直す必要があるかもしれませんね。
関連記事(※当記事と関連性が高いと思われる記事)
APCをインストールしました
2012/06/12CentOSにPHP5.3をインストール
2012/04/04PHP5.3のPEARをアップデート
2012/06/09CentOSでPHPのバージョンをアップデート
2011/12/23PHPを5.3系にアップデートしました
2012/04/01おすすめ書籍・商品(※当記事と関連性が高いと思われる書籍・商品)