2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

レンタルサーバーでPHPのSESSIONが作動しないとき

Last updated at Posted at 2021-02-28

きっかけ

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#file

var_dumpにこんなものを入れると検証に役立つ。

  • var_dump(session_save_path()); →セッションのセーブ先を出力する。iniファイルで設定したパスと同様になっているかはこれで確認する。ちなみにコアサーバーはかなりの時間を置くことでiniファイルの設定が反映される。一般的にはapacheを再起動するとiniファイルが反映されるようだが、間違ってもレンタルサーバーでしようとしてはいけない(というかできない)。
  • var_dump(shell_exec('ls '.session_save_path().' -la')); →セッションのセーブ先のファイル一覧を出力する。ここにSESSIONファイルらしきものが保存されていれば保存には成功している。
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?