読者です 読者をやめる 読者になる 読者になる

PHP のセッションを ElastiCache をつかって共有する

AWS PHP

ELC の設定

aws コンソールから ElastiCache を選択。

Launch Cache Cluster で新しくつくる。

  • Name は適切なものに
  • EnginememcachedPHP って Redis でセッション共有大丈夫なのかな?バージョン?)
  • Cache Engine Version はデフォルトのまま
  • Node Type はメモリの大きさに関わるので適切なものに
  • Number of Nodes1
  • Cache Port11211
  • Cache Subnet Groupdefault
  • Preferred Zone は 適切なAZ
  • Topic for SNS NotificationDisable Notifications
  • Auto Minor Version Upgrade は適切な方を

  • VPC Security Group(s) は適切なものに
  • Cache Parameter Groupdefault
  • Maintenance WindowNo Preference

こんなかんじで。

セキュリティグループで 11211 ポートでの通信を EC2 インスタンスなどからできるようにしておくこと。

EndpointMemcache サーバの名前なのでメモしておく。

PHP Session で Memcache を使う

pecl から memcache をいれます。yum からでもパッケージあれば入ると思います。 aws はありそうだけどみてないです。 あと、PHP の memcache ライブラリには、memcachememcached があるので注意してください。 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.inimemcache.so の設定と、セッションを file から memcache に変更します。

sudo vim /etc/php.ini

session.save_handler = memcache
session.save_path = "tcp://localhost:11211"

.
.
.

extension=memcache.so

Apachesudo 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 からハッシュを作成し、常に同じノードをみにいくようになっているだけなのですが。