質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

PHPでセッションを保持できないことについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,236

Newbi

score 158

いつもお世話になっております。

現在, VPSでサービスを公開する環境を整えているのですが, PHPでセッションを保持できない状態にありますので、ご助言をいただけませんでしょうか。
初歩的なことだったら大変申し訳無いのですが……

nginxとphp-fpmを用いてサービスを公開したいと考えています。
以下が現在進めている環境です。

-Arch Linux
-nginx/1.14.0
-php-fpm
-PHP/7.2.11

問題はセッションを保持できないことです。
例えば下記のような順番で、

<?php
    session_start();

    if ( isset($_SESSION['checker']) )
        var_dump($_SESSION); 

    $_SESSION['checker'] = true;

?>


セッションを実行したとして, 二回目にこのページを開いたときにはvar_dump()が実行されるはずですが, 現在そうならない状態です。
ローカルではXAMPPでずっと開発していたのでこの辺りはすぐに使えるかと思っていたのですが, 詰まってしまいました。

php.iniのsession.save_pathで指定したディレクトリのユーザーとグループはnginxやphp-fpmと揃えています。権限は750で書き込み自体は正常にできているようで, セッションを実行するたびに新規のファイルが作成されます。
状態としては、以下の方と似たような感じです。
https://serverfault.com/questions/727401/nginx-with-php-fpm-session-not-working
Google翻訳で読んでいるので多少違う点はあるかもしれませんが, 書き込みは成功しており新規ファイルは作られるものの, セッションがうまくいきません。
この方は解決策を見つけたらしく, session.cookie_pathの権限が問題だったという結論だと思うのですが, 公開用のディレクトリ内はすべてnginxのユーザーとグループで統一し, 権限は755を今は与えています。

質問させていただきたいことは上記を踏まえた2点です。
他にcookie_pathに関連してユーザー, グループ, 権限を書き換えるべきところがあるのでしょうか。
書き込みは成功しているのに値を保持しない, というこの状態について, 解決策にお心あたりのある方はいらっしゃいますでしょうか。

session.save_pathのユーザー, グループ, 権限の変更について多くの情報はありますが, この状態について分かりませんでした。
何卒, よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/10/26 06:44

    同じブラウザから実行されていますよね?

    キャンセル

  • Newbi

    2018/10/26 12:16

    同じブラウザです。Chromeを使って作業しています。

    キャンセル

回答 1

checkベストアンサー

+1

session 関係の切り分けは
・クライントに session id が保存されているか?
・サーバで適切に session の仕組みが動いているか?
の 2 点が基点です。

クライアント側は、開発者ツールでリクエスト/レスポンスを確認してください。
サーバ側は、条件つけないで

<?php
session_start();
var_dump($_SESSION); 


から始めるのが良いかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/26 12:47

    お忙しい中ご回答いただきありがとうございます。

    ご提示いただいたコードを実行して$_SESSIONの中身を見てみるとarray(0){}と空の配列になっています。
    ローカル環境では, 2回目以降は諸々の情報が保存されているのですが, やはり引き継がれてないようです。
    te2ji様のおっしゃるように, Chromeの開発者ツールでNetworkのHeadersを確認したところ,
    Response HeadersでSet-Cookieの表記があり, セッション自体はやはり作成時に保存されているようです。
    ですがRequest HeadersにCookieの表記が現れません。
    ローカル環境ではSet-Cookieの後, 2回目以降はRequest HeadersにCookieの表記が現れます。

    リクエスト/レスポンスがこちらのことで合っているとよいのですが^^;
    ひとまず保存はできるものの, 呼び出し(?)がうまく行ってないようなので, 書き込みではなく何かしらの読み込み権限やCookie関連を調べてみたいと思います。

    キャンセル

  • 2018/10/26 13:03

    すみません!
    解決しました!!
    http通信の段階でsession.cookie_secureをOnにしていことが原因でした!
    te2ji様にご指摘いただいたレスポンス/リクエストで, Set-Cookieの値をローカルとよく見比べてみたら, secure属性が付いていました!(ローカルにはありませんでした)
    session.cookie_secureをOffにしたらセッションを使用することができました!

    お忙しい中お騒がせしてしまってすみませんでした。
    ご回答いただき, 本当にありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる