きっかけ
SESSIONがないとログイン機能を実装できないのに、コアサーバーではSESSIONがなぜか機能していなかった。例えば推移先のページにこのようなコードを打つと、「ログインし直して下さい。」が返されてしまう。session_start();
if(!empty($_SESSION["userName"]))
echo $_SESSION["userName"]."がログイン中";
else {echo "ログインし直して下さい";exit;}
sessionが使えないときの対処法はすでにいくつか記事があるが、sudoコマンドが使えないレンタルサーバーでは少し異なる部分がある。
これを解決するのにかなりのサイトをめぐり試行錯誤したので結果をまとめておく。
環境
レンタルサーバー:コアサーバー 使用言語:php7.4 機能:SESSIONやりたいこと
- SESSION変数に値が保存される。
- SESSIONを自分の任意のディレクトリに保存できるようにする。※初期値の保存先は/tmpだが、これはセキュリティ上よろしくないし、なぜか私の場合は保存できなかったため。
やったこと
1.iniファイルのSESSION設定をいじる
(私はphp7.4を使いました)。コアサーバーでは各ユーザーに対して.iniファイルが用意されています。.htacessや.user.iniでも多分いけるとは思います。cd ~/public_html/.fast-cgi-bin
session.save_path = /virtual/ユーザー名/session
ちなみに検索している最中に下記の設定を加える話があったが、あくまで任意の設定で、触らなくても動く。
session.hash_function = 1
(sessionファイル名の名前はハッシュ値で出るらしいが、これのアルゴリズム)
session.hash_bits_per_character = 4
session.sid_bits_per_character = 6
(sessionファイル名に使われる文字の種類が増える。4なら0-9とa-fまで、6なら0-9とa-zの大文字小文字が使われる)
session.sid_length = 64
(sessionファイル名の長さ。長い方が特定されにくいらしい)
session.entropy_file = /dev/random
(sessionファイルの名前を乱数で生成する時、どこから取るかを指定。php7.1ですでに廃止された)
2セッションを保存するディレクトリを作成する。
私はホームディレクトリ(~/)にsessionディレクトリを作った$ mkdir session
$ chmod u+rwx session
#実行権限を与えることでsessionにファイルを作れるようになる
sessionファイルがうまく作れるとlsでこんなファイルが生成される。今回は所有者グループの欄をapacheやngixに直す必要はなかった。(レンタルにはそもそも権限がない)
$ ls-l
-rw------- 1 username hpusers 0 2月 25 19:20 sess_3aQ6CWkJDFln6Fn0vDQVRSrU3gcAhkBIdxlWkTZemiNuqUH55ShVgqqMBabIYA,v
おまけ
全般的なデバッグについてはこちらの方が徹底的に分類してくださっているので、おすすめします。最終的にcookieの設定は関係なかったけど、sessionを理解する上では役立ちました。 https://note.kiriukun.com/entry/20191125-session-not-working-in-php#filevar_dumpにこんなものを入れると検証に役立つ。
- var_dump(session_save_path()); →セッションのセーブ先を出力する。iniファイルで設定したパスと同様になっているかはこれで確認する。ちなみにコアサーバーはかなりの時間を置くことでiniファイルの設定が反映される。一般的にはapacheを再起動するとiniファイルが反映されるようだが、間違ってもレンタルサーバーでしようとしてはいけない(というかできない)。
- var_dump(shell_exec('ls '.session_save_path().' -la')); →セッションのセーブ先のファイル一覧を出力する。ここにSESSIONファイルらしきものが保存されていれば保存には成功している。