Webサービスのパフォーマンス向上で目に見えて効果があることの一つがDBへのアクセス回数を減らすことです。
それはSQLを発行する回数を少なくするなど、普段からのプログラムの書き方ももちろん大事なのですが、キャッシュを使うのも大切な方法の1つです。
キャッシュの種類
キャッシュと一口に言っても以下のように様々な種類があります。
static変数
- PHPディフォで使えるstatic変数
- 何度も呼び出されるけど同じ関数、メソッドないで返り値をあらかじめキャッシュして無駄な計算を減らす
APC
- スピードはかなり高い
- メモリへの負荷が高い
- 静的データのキャッシュに向いている
- 最速なので速度が求められ、apacheの再起動が起こってキャッシュがクリアされても問題ない部分。
Memcached
- memcachedというサーバー自体を別に立てます。memcached自体がメモリにデータをキャッシュするため、スピードは劣りますが、サーバー全体で値を共有することができます。(これがネックになってしまうこともあります。)
注意点
- DBとのデータとの整合性。
- UPDATE/DELETE時にキャッシュも更新、削除を行うこと。
キャッシュのまとめ
過負荷に耐えるWEBサービス作成のための使えるPHPキャッシュテクニックまとめ
PHP独自Frameworkでのキャッシュについてまとめ
Memcachedに関して
実務で使っているので、ちょっと特集。
インストール(centOS6系 / php5.6 です)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#memcachedのインストールと起動 yum -y install memcached memcached -u memcached -d #動かしたあとはps -aux | grep memcachedで確認してみましょう。 #phpで動かすために下記を入れる必要あり(enablerepoはphp5.6だからかもしれません・・・) yum -y install --enablerepo="remi-php56" php-pecl-memcached #インストールされているかどうかを確認してみましょう。 php -i | grep memcached #下記のように表示されていればOKです。 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 => igbinary => igbinary memcached.sess_binary => no value => no value memcached.sess_connect_timeout => 1000 => 1000 memcached.sess_consistent_hash => no value => no value 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 => no value => no value memcached.sess_remove_failed => 1 => 1 memcached.sess_sasl_password => no value => no value memcached.sess_sasl_username => no value => no value memcached.store_retry_count => 2 => 2 memcached.use_sasl => no value => no value Registered save handlers => files user memcached php --ini ・・・・・ /etc/php.d/50-memcached.ini(←これが入っていればOK) #またwebで使う場合はwebサーバー(apache や nginx & php-fpm)を再起動させましょう。 #phpinfoでみてmemcachedが有効になっていればOKです。 |
注意点としてmemcachedとmemcaheは違うもののようです。dがついているほうが後発でかつ機能も多いようです。
インストール自体はなかなか手こずりました・・
下記のようなライブラリの依存エラーが出ることもありました。
1 2 3 4 |
トランザクションの確認エラー file /usr/lib64/libhashkit.so.2.0.0 conflicts between attempted installs of libmemcached10-1.0.16-1.ius.el6.x86_64 and libmemcached-last-libs-1.0.18-6.el6.remi.x86_64 file /usr/lib64/libmemcached.so.11.0.0 conflicts between attempted installs of libmemcached10-1.0.16-1.ius.el6.x86_64 and libmemcached-last-libs-1.0.18-6.el6.remi.x86_64 file /usr/lib64/libmemcachedutil.so.2.0.0 conflicts between attempted installs of libmemcached10-1.0.16-1.ius.el6.x86_64 and libmemcached-last-libs-1.0.18-6.el6.remi.x86_64 |
ライブラリが足りてないようなので、下記の要領でインストールし、もう一度php-pecl-memcachedをインストールして解決です。
1 2 |
yum -y install --enablerepo="remi-php56" libmemcached-last-libs yum -y install --enablerepo="remi-php56" php-pecl-memcached |
CentOS7はこちら
CentOS 7にMemcached最新版をインストールしてPHPと連携する
プログラムでの活用
1 2 3 4 5 6 |
$memcache = new Memcached(); $memcache->addServer('localhost', 11211); $data = 'キャッシュに保存'; $memcache->set('samplekey', $data, 10000); $get_data = $memcache->get('samplekey'); echo $get_data; |
ディレクターなら知っておきたいキャッシュサーバ「memcached」の基礎知識【PHP編】
ちなみにmemcachedの場合キャッシュされたデータをdumpしてみることができます。
1 2 3 4 5 6 7 |
memcached-tool localhost dump Dumping memcache contents Number of buckets: 1 Number of items : 1 Dumping bucket 1 - 1 total items add key 0 1493032512 24 キャッシュに保存 |
memcached の中身を確認するなら memcached-tool コマンド
CakeでももちろんMemcachedはサポートしています。簡単なんですぐに取り込めます。
[…] キャッシュについて(主にmemcachedを中心に) […]