WEBサービスにMySQLやPostgreSQLなどのデータベースを使うことは多いですが、アクセスが集中すると捌ききれなくなったり、一時的なデータのINSERTが頻繁にあると負荷が高くなったり問題がいくつかでてきます。
それを解決する一つの手段がMemcachedというソフトです。
Memcachedはメモリを使ったキャッシュシステムで、SELECTの結果を一時的にキャッシュしてデータベースの処理回数を減らしたり、セッションなどの一時的な情報をキャッシュしたりできます。
今回はMemcachedを導入してApacheやPHPと連携させてみます。
使用したOS
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
使用したApache
[root@localhost ~]# /usr/local/apache2/bin/apachectl -v
Server version: Apache/2.4.12 (Unix)
Server built: Apr 12 2015 03:53:10
使用したPHP
[root@localhost ~]# php -v
PHP 5.6.8 (cli) (built: May 5 2015 05:30:25)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
環境構築
Memcachedをダウンロード
今回は1.4.24を使用します。
wget http://www.memcached.org/files/memcached-1.4.24.tar.gz -O memcached-1.4.24.tar.gz
Memcachedをインストール
tar xvf memcached-1.4.24.tar.gz
cd memcached-1.4.24
yum -y install libevent-devel
./configure --enable-64bit
make
make install
libmemcachedをインストール
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar xvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure
make
make install
php-pecl-memcachedをインストール
MemcachedをPHPで使えるようにするモジュールをインストールします。
wget http://pecl.php.net/get/memcached-2.2.0.tgz
tar xvf memcached-2.2.0.tgz
cd memcached-2.2.0
yum -y install autoconf
phpize
./configure --with-libmemcached-dir=/usr/local/ --disable-memcached-sasl
make
make install
PHPにモジュールを読み込ませる
php.iniを編集してMemcachedを使えるようにします。
vi /usr/local/lib/php.ini
下記を追記
extension=memcached.so
動作確認
[root@localhost memcached-1.4.24]# memcached -V
memcached 1.4.24
バージョンが表示されればインストール完了です。
[root@localhost ~]# php -i | grep memcached
memcached
memcached support => enabled
libmemcached version => 1.0.18
memcached.compression_factor => 1.3 => 1.3
memcached.compression_threshold => 2000 => 2000
memcached.compression_type => fastlz => fastlz
memcached.serializer => php => php
memcached.sess_binary => 0 => 0
memcached.sess_connect_timeout => 1000 => 1000
memcached.sess_consistent_hash => 0 => 0
memcached.sess_lock_expire => 0 => 0
memcached.sess_lock_max_wait => 0 => 0
memcached.sess_lock_wait => 150000 => 150000
memcached.sess_locking => 1 => 1
memcached.sess_number_of_replicas => 0 => 0
memcached.sess_prefix => memc.sess.key. => memc.sess.key.
memcached.sess_randomize_replica_read => 0 => 0
memcached.sess_remove_failed => 0 => 0
memcached.store_retry_count => 2 => 2
Registered save handlers => files user memcached
PWD => /usr/local/src/memcached-2.2.0
_SERVER["PWD"] => /usr/local/src/memcached-2.2.0
ちゃんとmemcachedが読み込まれてます。
Memcachedを起動
rootでは起動出来ないので他のユーザーに切り替えてから起動してください。
/usr/local/bin/memcached -p 11211 -m 64m -d
Memcachedを試す
テストするためにPHPでコードを書いてみます。
<?php
$memcache = new Memcached();
$memcache->addServer('localhost', 11211);
$data = 'MemcachedをPHPで使うテスト';
$memcache->set('key', $data, 1000);
echo $get_data = $memcache->get('key');
?>
作ったプログラムにブラウザからアクセスすると文字がちゃんと表示されます。
次にMemcachedのパッケージに含まれているmemcached-toolを使ってメモリ内のキャッシュを確認してみます。
[root@localhost ~]# /usr/local/src/memcached-1.4.24/scripts/memcached-tool localhost dump
Dumping memcache contents
Number of buckets: 1
Number of items : 1
Dumping bucket 2 - 1 total items
add key 0 1430849134 33
MemcachedをPHPで使うテスト
ちゃんとセットした文字列がキャッシュされています。
これでMemcachedをPHPで使えるようになりました。
実際にはさらにチューニングなどが必要ですが、使えるようになれば出来る事の幅がかなり広がりそうです。
コメント