下記記事で構築した Docker コンテナを使用して、PHP のサンプルプログラムを作成しようとしたところ、セッション情報が取得できなくて非常に悩みました。
こんな簡単なプログラムで、 PHP のセッション情報が参照できなかったです。
login.php
<?php session_start(); $_SESSION['token'] = 1; header("Content-type: text/html; charset=utf-8"); ?> <!DOCTYPE html> <html lang="ja"> <body> <h1>ログイン</h1> <form action="login_check.php" method="post"> <table border="0"> <tr> <td>メールアドレス:</td> <td><input type="text" name="email"></td> </tr> <tr> <td> パスワード: </td> <td> <input type="password" name="password"> </td> </tr> </table> <input type="hidden" name="token" value="<?php echo htmlspecialchars($_SESSION['token'], ENT_QUOTES, "UTF-8") ?>"> <input type="submit" value="ログイン"> <input type="reset" value="リセット"> </form> </body> </html>
login_check.php
<?php session_start(); var_dump($_SESSION); // ここで値を取得できない
こんな基本的すぎるところで詰まってしまって、情報がなさすぎて何時間も悩んでしまいました。
原因は、下記サイトに掲載されていた原因(4)でした。情報感謝です。
session_start() に関するエラー内容
原因(1) ファイルの先頭に改行がある
原因(2) UTF-8 の BOM 有りになっている
原因(3) output_buffering が Off になっている
原因(4) セッションディレクトリに権限が無い
セッションを書き込むディレクトリのオーナーが、nginx を使っているのに apache になっていました。。。
# ls -l total 16 drwxrwx--- 2 root apache 4096 May 7 02:32 opcache drwxr-xr-x 2 root root 4096 May 7 02:32 peclxml drwxrwx--- 2 root apache 4096 May 7 02:32 session drwxrwx--- 2 root apache 4096 May 7 02:32 wsdlcache
なので、以下のコマンドを実行することで解決しました。
# chown nginx:nginx /var/lib/php/session
こんなの分からないよ。。
あ、元記事の Docker コンテナの構築にも反映させました。