web-dev-qa-db-ja.com

PHP7.1でセッションデータを読み取れませんでした

私が抱えていた(そして今解決した)問題を共有する。

開発マシンで、PHPでIISを実行します。PHP7にアップグレードすると、突然コードが機能しなくなり、このエラーが返されました...

session_start():セッションデータの読み取りに失敗しました:ユーザー(パス:C:\ WINDOWS\temp)

権限の問題のように見えますよね?そのため、php.iniの設定を微調整し、フォルダーのアクセス許可を変更しようとして長い時間を費やしましたが、成功しませんでした。

それから私は何かを実現しました。以下の私の答えをご覧ください。

7
xtempore

私はついにメッセージが無意味であることに気付きました-アプリケーションはデータベースを使用して独自のセッションハンドラを実装します。 readメソッドでは、データベースから文字列としてセッションデータを取得します。

class Sess implements SessionHandlerInterface
...
    public function read($key)
    {
        $qKey = U_Data::quote($key);
        $dt = U_Data::datetime();
        $sql = <<<EOT
SELECT `sess_data` FROM `sess`
WHERE `sess_key` = $qKey 
AND `sess_exp_ts` > $dt
ORDER BY `sess_exp_ts` DESC
LIMIT 1
EOT;
        return U_Data::getOneVal($sql);
    }

U_Data :: getOneValメソッドには、一致するデータがない場合に返す2番目のパラメーターがあります。デフォルトはnullで、PHP5では正常に機能しましたが、PHP7.1ではエラーが発生します。代わりに空の文字列を返すように簡単に変更することで、問題を解決しました。

        return U_Data::getOneVal($sql, '');

そこにあります。 session_startが機能しないという警告が表示され、独自のセッションハンドラを実装している場合は、readメソッドでコードを確認してみてください- 常に文字列を返します

(注:U_Dataは単なる自分のデータユーティリティクラスです)

これにより、他の誰かが頭を悩ます時間を節約できることを願っています!

35
xtempore

自分で同じエラーを取得していました。多くのグーグルと呪いの後、それは本当に私の場合、エラー出力に記載されたパスではなく、htdocsルートフォルダ上でのアクセス許可の問題であることを証明しました。ルートフォルダーのアクセス許可は700でしたが、その中の他のすべては755でした(フォルダーのアクセス許可について755を規定するJoomlaのインストールがあります)。ルートフォルダーのアクセス許可を修正すると、最終的に問題のブロックが解除されました。

2
John Rix