あるSEのつぶやき・改

ITやシステム開発などの技術に関する話題を、取り上げたりしています。

PHPのsesseion_start()に失敗してセッション変数が取得できない場合の対処方法

下記記事で構築した Docker コンテナを使用して、PHP のサンプルプログラムを作成しようとしたところ、セッション情報が取得できなくて非常に悩みました。

www.aruse.net

こんな簡単なプログラムで、 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) セッションディレクトリに権限が無い

warumono.at.webry.info

セッションを書き込むディレクトリのオーナーが、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 コンテナの構築にも反映させました。