さくらの VPS 設定覚書(4)PHP
PHP(Hypertext Preprocessor)は、動的にウェブページを生成するプログラミング言語で、WordPress, Mediawiki, phpBB など、多くのウェブ・アプリケーションで採用されている代表的なスクリプト言語です。ここでは、PHP の拡張モジュールである APC と memcached をインストールすることで、キャッシュを利用することで、ウェブ・アプリケーションを高速化する方法を解説します。
1. PHP
ルート権限がある状態で、PHP の設定ファイルを開きます。
vi /etc/php.ini
必要に応じて、以下の設定変更を行います。
1.1. PHP の情報の非開示
セキュリティを高めるために、PHP のバージョンを外部に表示しないようにします。
expose_php = On ↓ expose_php = Off
1.2. メモリの上限設定
デフォルトの制限値が低すぎて、メモリ制限エラーが出るようなときは、以下のように引き上げましょう。各設定項目は離れた位置にあるので、一つずつ“/キーワード”で検索して探してください。
memory_limit = 128M post_max_size = 8M upload_max_filesize = 2M ↓(例) memory_limit = 1024M post_max_size = 256M upload_max_filesize =128M
値は任意ですが、memory_limit > post_max_size > upload_max_filesize となるように設定しなければなりません。
1.3. 時間帯の設定
PHP のタイムゾーンを日本の時間帯にします。
;date.timezone = ↓ date.timezone = "Asia/Tokyo"
1.4. 文字コードの設定
日本語などマルチバイト文字が使えるようにします。
;mbstring.language = Japanese ;mbstring.internal_encoding = EUC-JP ;mbstring.http_input = auto ;mbstring.http_output = SJIS ↓ mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = auto mbstring.http_output = auto
設定が終わったら、保存して閉じます。
2.APC
APC は、Alternative PHP Cache の頭文字をとったもので、PHP の中間コードのキャッシュや最適化を行います。似たようなモジュールに eAccelerator や XCache などがありますが、APC は、次期 PHP6 で公式にバンドルされる予定なので、最も将来性があります。
2.1. PECL によるインストールと設定
APC をまだインストールしていない場合は、
yum --enablerepo=remi,epel,rpmforge install php-pecl-apc
でインストールしてください。
インストール後、PHP の設定ファイルを開きます。
vi /etc/php.ini
適当な場所(一番下など)に以下のように書き込みます。
extension=apc.so apc.enabled = 1 apc.shm_size = 288M apc.max_file_size = 144M apc.gc_ttl = 3600 apc.ttl = 7200
- apc.enabled : APC を有効にするか否かのオプション。0 だと無効で、1 だと有効になります。
- apc.shm_size : APC に割り当てる共有メモリサイズ。単位はバイトなので、Mを付けることを忘れてはいけません。使用する PHP アプリケーションの数を n とすると、32(n+1) が最適値です。
- apc.max_file : キャッシュするファイルの上限値。デフォルトは 1M です。
- apc.gc_ttl : キャッシュ・エントリがガベージ・コレクションのリストに残る秒数。上の例だと一時間。
- apc.ttl : ユーザ・キャッシュ・エントリが、他のエントリに割り当てられるまでスロットに残っている秒数の上限。
設定を終えたら、保存して閉じ、 Apache を再起動します。
/etc/init.d/httpd restart
2.2. ソースコードによるインストールと設定
ソースコードからインストールするには、まず、ソースコード・ディレクトリに移行します。
cd /usr/local/src
Alternative PHP Cacheで最新のバージョン(ここでは、3.1.9)を確認して、圧縮ファイルをダウンロードします。
wget http://pecl.php.net/get/APC-3.1.9.tgz
解凍します。
tar -zxvf APC-3.1.9.tgz
解凍したファイルに移行します。
cd APC-3.1.9
ビルドします。
phpize
設定ファイルのディレクトリを探します。
whereis php-config
通常は、“/usr/bin/php-config”にあるので、その場合、APC を有効にするコマンドは、以下のようになります。
./configure --enable-apc --enable-apc-mmap --with-apxs --with-php-config=/usr/bin/php-config
コンパイルします。
make
コンパイルしたファイルをインストールします。
make install
次に、設定ファイルを作ります。
vi /etc/php.d/apc.ini
例えば、以下のように設定します。
extension=apc.so apc.enabled = 1 apc.shm_size = 288M apc.max_file_size = 144M apc.gc_ttl = 3600 apc.ttl = 7200
設定を終えたら、保存して閉じ、 Apache を再起動します。
/etc/init.d/httpd restart
2.3. インストールと設定の確認
APC がインストールされていること、およびその設定事項は、phpinfo() 関数を使って、確認することができます。
コマンドを使うなら、
php -R ' phpinfo(); exit(); ' | grep "apc"
で見ることができます。ブラウザで確認するには、テキストファイル・エディタで
<?php phpinfo(); ?>
と書いたファイルを作成し、“php_info.php”など、適当な名前を付けて、php 拡張子のあるファイルとしてどこかに保存します。次にそれをドメインのルートディレクトリにアップロードし、
http://domain.com/php_info.php
というような URL でアクセスします。スクロールすると、以下のような APC の項目を見つけることができます。

この方法だと、インストールしたすべてのモジュールを一覧で見ることができるので、その点で便利です。このファイルを放置し続けることは、セキュリティ上好ましくないので、確認して不要になったら、削除しましょう。
2.4. メモリやキャッシュの管理
メモリやキャッシュの使用量を見たり、キャッシュを削除したりするには、apc.php にログインする必要があります。以下は、ソースコードからインストールした場合を前提に書きます。
まずは、このファイルをブラウザで閲覧可能なディレクトリにコピーします。
cp usr/local/src/APC-3.1.9/apc.php /var/www/html/root/apc.php
このファイルをエディタで開き、
defaults('ADMIN_USERNAME','apc'); // Admin Username
defaults('ADMIN_PASSWORD','password'); // Admin Password - CHANGE THIS TO ENABLE!!!
とあるところを見つけ、“password”を適当なパスワードで置き換えます。それからブラウザで、
http://www英数字.sakura.ne.jp/apc.php
にアクセスします。すると、次のようなメモリの使用状況を示すグラフを見ることができます。

この画面の右肩にある“'apc' logged in!”をクリックし、“apc”というユーザ名と指定したパスワードで、ログインすると、ディレクトリごとのキャッシュ数を参照したり、キャッシュを削除したりすることができます。
3.Memcached
YouTube, Wikipedia, Facebook, Mixi などの有名サイトでも採用されている分散型メモリ・キャッシュ・システムで、データベースへの問い合わせ結果を一時的にキャッシュすることで、データベースへのアクセス回数を減らすことができるので、動的なウェブ・アプリケーションの高速化やスケーラビリティの向上のために利用されています。
3.1. yum によるインストールと設定
以下のモジュールをまだインストールしていない場合は、以下のコマンドで、インストールしてください。
yum --enablerepo=remi,epel,rpmforge install libevent libevent-devel memcached php-pecl-memcache php-pecl-memcached
設定ファイルを開きます。
vi /etc/sysconfig/memcached
必要に応じて、例えば以下のように修正します。
PORT="11211" USER="memcached" MAXCONN="4096" CACHESIZE="2048" OPTIONS="-d -l 127.0.0.1 -B binary"
- PORT:受信する TCP ポート。こう指定しなくても、デフォルトの 11211 が利用されます。
- USER:デーモンの実行ユーザを指定します。 “root” は不可なので、“memcached”としておきます。
- MAXCONN:最大の接続数。デフォルトは1024で、1024 よりも大きな値にする場合はルート権限が必要です。
- CACHESIZE:キャッシュ・メモリの最大サイズ。単位はビットで、上の例では、2GB が割り当てられています。
- OPTIONS:その他のオプションを入力することができます。
- d:デーモンとしてバック・グラウンドで実行させます。
- l :受信する IP アドレス。グローバル IP アドレスだと、外部のサーバからアクセスできるので、セキュリティ上の理由から好ましくありません。127.0.0.1 とすることで、ローカルホストからのみ参照できるようにしましょう。
- B:プロトコル・バインド。セキュリティ上の理由から、バイナリにした方が好ましい。
閉じて、保存します。
次に、Memcached を起動します。
service memcached start
“OK”と出たら、起動に成功しています。
次に、以下の一連のコマンドで、自動起動の設定を行います。
chkconfig --add memcached chkconfig memcached on chkconfig --list memcached
“0:off 1:off 2:on 3:on 4:on 5:on 6:off”と出れば、設定成功。
3.2. ソースコードによるインストールと設定
ソースコードによるインストールは、面倒ですが、最新版を確実にインストールすることができるというメリットがあります。インストールに先立って、以下のリンク先で、libevent, memcached, memcache の最新のバージョンを確認してください。
2011年11月現在、libevent-2.0.15, memcached-1.4.10, memcache-2.2.6 が最新版なので、以下この数字を使いますが、アップグレードされているときは、数字を変更してください。
ソースコードのディレクトリに移行します。
cd /usr/src
三つのモジュールをダウンロードし、解凍します。
wget --no-check-certificate https://github.com/downloads/libevent/libevent/libevent-2.0.15-stable.tar.gz tar zxvf libevent-2.0.15-stable.tar.gz wget http://memcached.googlecode.com/files/memcached-1.4.10.tar.gz tar zxvf memcached-1.4.10.tar.gz wget http://pecl.php.net/get/memcache-2.2.6.tgz tar zxvf memcache-2.2.6.tgz
まずは、Libevent をインストールしましょう。以下のコマンドを、順次実行していってください。
cd /usr/src/libevent-2.0.15-stable ./configure make make install
次に、Memcached 本体のインストールです。
cd /usr/src/memcached-1.4.10 ./configure --build=x86_64-unknown-linux-gnu --enable-64bit --with-libevent=/usr/lib64/ make make install
以下のコマンドで、正しくインストールされているかどうかを確かめましょう。
memcached -h
“memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory. ”というエラー・メッセージが出るときには、
ln -s /usr/local/lib/libevent-2.0.so.5 /lib64/
というようにして、32ビット用のフォルダから64ビット用のフォルダにシンボリック・リンクを張ります。
成功すると、様々な起動オプションのリストが出てくるので、そのうち必要なものを選んで設定をしましょう。以下は、その設定コマンドの例です。
memcached -d -u memcached -p 11211 -l 127.0.0.1 -m 2048 -c 4096 -B binary
- d:デーモンとしてバック・グラウンドで実行させます。
- u:デーモンの実行ユーザを指定します。 “root” は不可なので、“memcached”としておきます。
- p:受信する TCP ポート。こう指定しなくても、デフォルトの 11211 が利用されます。
- l :受信する IP アドレス。グローバル IP アドレスだと、外部のサーバからアクセスできるので、セキュリティ上の理由から好ましくありません。127.0.0.1 とすることで、ローカルホストからのみ参照できるようにしましょう。
- m:キャッシュ・メモリの最大サイズ。単位はビットで、上の例では、2GB が割り当てられています。
- c:最大の接続数。デフォルトは1024で、1024 よりも大きな値にする場合はルート権限が必要です。
- B:プロトコル・バインド。セキュリティ上の理由から、バイナリにした方が好ましい。
次に、起動スクリプトを作成しましょう。以下のコマンドで、デーモン起動スクリプトにコピーします。
cp /usr/src/memcached-1.4.10/scripts/memcached.sysv /etc/rc.d/init.d/memcached
ファイルを連結表示させます。
cat /etc/rc.d/init.d/memcached
Memcached を起動します。
service memcached start
“OK”と出たら、起動に成功しています。
次に、以下の一連のコマンドで、自動起動の設定を行います。
chkconfig --add memcached chkconfig memcached on chkconfig --list memcached
“0:off 1:off 2:on 3:on 4:on 5:on 6:off”と出れば、設定成功。
最後に、Memcache クライアントをインストールします。
cd /usr/src/memcache-2.2.6 phpize ./configure make make install
“Installing shared extensions: /usr/lib64/php/modules/”と出てきたならば、
ls /usr/lib64/php/modules/
で、“memcache.so”が“memcached.so”とともに入っていることを確認しましょう。
仕上げに、アパッチを再起動します。
service httpd restart
3.3. キャッシュの内容を確認する
memcached には、memcached-tool が付属しています。このツールでどのようなことができるか見てみましょう。
memcached-tool
このコマンドで、以下のようなリストが出てきます。
Usage: memcached-tool <host[:port]> [mode]
memcached-tool 10.0.0.5:11211 display # shows slabs
memcached-tool 10.0.0.5:11211# same. (default is display)
memcached-tool 10.0.0.5:11211 stats # shows general stats
memcached-tool 10.0.0.5:11211 dump # dumps keys and values
- display:その時点での memcached 上に存在するキャッシュの一覧を表示します。
- stats:様々な変数を表示します。
- dump:キャッシュの中身を提示します。
一番重宝するのは、三番目のオプションです。
memcached-tool 10.0.0.5:11211 dump
というコマンドで、キャッシュの内容を確認することができます。
キャッシュをクリアするには、再起動をします。
service memcached restart
次に、MySQL の設定と、データベースの構築を行いましょう。
- PHP: Hypertext Preprocessor
- Alternative PHP Cache
- memcached - a distributed memory object caching system
- よくわかるPHPの教科書
- How to Install APC (Alternative PHP Cache) on CentOS 5.6
- Improve security for apc.php | mathie's tech+business bits
- Install Memcached on Fedora 16/15, CentOS/Red Hat (RHEL) 6/5.7
- memcached のキャッシュ内容確認 - Webエンジニアの技術メモ ~PHP、SQL、Linuxなど~
このページでのコメントの受付は終了しました。本ページに関して、御意見、御質問、御批判をお持ちの方で、私に回答を求める方は、システム論フォーラムに投稿してください。




