PHP のセッションを ElastiCache をつかって共有する
ELC の設定
aws コンソール
から ElastiCache
を選択。
Launch Cache Cluster
で新しくつくる。
Name
は適切なものにEngine
はmemcached
(PHP って Redis でセッション共有大丈夫なのかな?バージョン?)Cache Engine Version
はデフォルトのままNode Type
はメモリの大きさに関わるので適切なものにNumber of Nodes
は1
Cache Port
は11211
Cache Subnet Group
はdefault
Preferred Zone
は 適切なAZTopic for SNS Notification
はDisable Notifications
Auto Minor Version Upgrade
は適切な方を
VPC Security Group(s)
は適切なものにCache Parameter Group
はdefault
Maintenance Window
はNo Preference
こんなかんじで。
セキュリティグループで 11211 ポート
での通信を EC2 インスタンスなどからできるようにしておくこと。
Endpoint
が Memcache
サーバの名前なのでメモしておく。
PHP Session で Memcache を使う
pecl
から memcache
をいれます。yum
からでもパッケージあれば入ると思います。 aws はありそうだけどみてないです。
あと、PHP の memcache ライブラリには、memcache
と memcached
があるので注意してください。
AWS が配布している Auto Discovery 対応のライブラリは、memcached
です。
その場合、session.save_handler と extension=memcache.so が memcached にかわります。
sudo yum -y install php-devel gcc make zlib-devel php-pear httpd-devel
sudo pecl install memcache
pecl
からなので、php.ini
に memcache.so
の設定と、セッションを file
から memcache
に変更します。
sudo vim /etc/php.ini
session.save_handler = memcache
session.save_path = "tcp://localhost:11211"
.
.
.
extension=memcache.so
Apache
を sudo service httpd restart
などで設定を読み込む。 reload
でもいけるんかな。
確認する
cat << EOF > /var/www/html/st.php
<?php
session_start();
?>
<html>
<head><title>PHP TEST</title></head>
<body>
<?php
print(\$_SERVER["SERVER_ADDR"] . "<br><br>");
if (!isset(\$_COOKIE["PHPSESSID"])){
print('初回の訪問です。セッションを開始します。');
}else{
print('セッションは開始しています。<br>');
print('セッションIDは '.\$_COOKIE["PHPSESSID"].' です。');
}
?>
</body>
</html>
EOF
ELC の複数ノードを設定する
上述の手順では、ELC のエンドポイントを拾ってきたんですけど、これはエンドポイント=ノード1 になってるから問題なくて、複数ノードとなっている場合、エンドポイントを指定するとセッションをうまく共有できなくなってしまいます。
PHP スクリプトから ELC を使う場合は、Auto Discovery を使用するオプションを設定し、エンドポイントへの接続で問題ないのですが、セッション設定の場合、オプション指定する方法がわからなかったので今までどおり、ノードのカンマ区切りで指定します。 詳細には次の通りです。
sudo vim /etc/php.ini
session.save_handler = memcache
session.save_path = "tcp://node-1-elc:11211,tcp://node-2-elc:11211,tcp://node-3-elc:11211"
.
.
.
extension=memcache.so
これで、複数の ELC ノードを使用してセッションを共有してくれます。 まあ、セッションID からハッシュを作成し、常に同じノードをみにいくようになっているだけなのですが。