uwu

プログラミングの備忘録を書いています。誰かの為になれば幸いです

Herokuでsessionを使う

勉強の為にPHPで作ったWebサービスをHerokuにデプロイした後
このようなエラーが発生。

session_start(): open(C:/MAMP/bin/php/var/sess_5c0c3cbde4aisjkq6i8arsuaq1bjtabf, O_RDWR) failed: No such file or directory (2) in /app/function.php on line 30

Warning: session_start(): Failed to read session data: files (path: C:/MAMP/bin/php/var) in /app/function.php on line 30

Warning: session_regenerate_id(): Cannot regenerate session id - session is not active in /app/function.php on line 31

問題となっている部分のコードはこちら。

session_save_path("C:/MAMP/bin/php/var");
ini_set('session.gc_maxlifetime', 60 * 60 * 24 * 30);
ini_set('session_cookie_lifetime', 60 * 60 * 24 * 30);
session_start();
session_regenerate_id();


当たり前だと言われそうですがセッションの情報を自分のPC上のファイルに保存していた為、
セッションを保存するファイルが見つからないから
セッションスタートできないしセッションIDを生成できないよ!と言われています。



セッションの保存方法はMemcacheやRedisに保存したり、
MySQLなどのリレーショナルデータベースに保存したりいろいろありますが
今回はHerokuのサイトにやり方が載っていたのでHerokuのMemcachierアドオンを入れて
HerokuからMemcachedを動かせるようにします。


MemCachier | Heroku Dev Center



アドオンをインストールします。アドオンは無料で使えますが
このアドオンを入れる前にHerokuにクレジットカードの登録が必要です。


heroku addons:create memcachier:dev


実行したら、

heroku config

でインストールできたか確認します。

...
MEMCACHIER_SERVERS => mcX.ec2.memcachier.com
MEMCACHIER_USERNAME => bobslob
MEMCACHIER_PASSWORD => l0nGr4ndoMstr1Ngo5strang3CHaR4cteRS
...



↑の例のように3つの変数が表示されていればOKです。



ここから先はcomposerが入っていることが前提になります。



デプロイしたディレクトリを開きターミナル上でcomposer.json


{
    "require": {
        "php": ">=5.3.2",
        "ext-memcached": "*"
    }
}


を追記し

composer uodate

を実行します。


このようなエラーが発生しました。


Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires PHP extension ext-memcached * but it is missing from your system. Install or enable PHP's memcached extension.

「あなたのPCにmemcached拡張機能がないからインストールするか、
使えるようにしてね」と言われています。



サイトを見てみるとphp-memcachedというものをインストールする必要がありそうなので
yumを使ってインストールしていきます。


yum install -y php74-php-pecl-memcached

php74の部分はPHP7.4以外をお使いの方はお使いのPHPに書き換えてください。
例えばPHP8.0をお使いであればphp80となります。
オプションの-yはインストールしますか?[YN]の部分をスキップするためのものです。




memcacheddの付け忘れに注意。memcacheという別のPHPライブラリをインストールしてしまいます!
(こういうことはあるあるですがややこしい名前をつけるのはやめてほしいですよね。
実際stack overflowなどを見ているといろんな人が間違えているようでした。)



次にphp.iniに以下をわかりやすい場所に追記します。
私の場合、php.iniは/etc/php.iniというパスでありました。
php.iniを編集する時は必ずcpでバックアップをとりましょう。

extension=memcached.so
php -m


でエラーなくmemchachedが入っていればOkです。
php-memcachedをインストールできたので

composer update

で今度は問題なく実行できました。



.user.iniファイルを作成します。

touch .user.ini


作成した.user.iniに下記を追記します。
私の場合PHP7系を使用してるのでmemcached.sess_binary=1 # for ext-memcached 2 / PHP 5はコメントアウトしました。

session.save_handler=memcached
session.save_path="${MEMCACHIER_SERVERS}"

memcached.sess_binary=1 # for ext-memcached 2 / PHP 5
memcached.sess_binary_protocol=1 # for ext-memcached 3 / PHP 7

memcached.sess_sasl_username="${MEMCACHIER_USERNAME}"
memcached.sess_sasl_password="${MEMCACHIER_PASSWORD}"

再度これでデプロイしてみるとセッションのエラーが消えてました!