11

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

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

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

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

すると、あることに気づきました。以下の私の答えを見てください。

4

3 に答える 3

44

最後に、メッセージが無意味であることに気付きました。アプリケーションは、データベースを使用して独自のセッション ハンドラーを実装しています。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メソッドでコードをチェックして、常に string が返されることを確認してください。

(注: U_Data は、私自身のデータ ユーティリティ クラスです)

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

于 2017-01-09T02:47:28.473 に答える