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]の部分をスキップするためのものです。
memcachedのdの付け忘れに注意。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}"
再度これでデプロイしてみるとセッションのエラーが消えてました!