【问题标题】:Failed to read session data on PHP7.1在 PHP7.1 上读取会话数据失败
【发布时间】:2017-05-23 06:12:28
【问题描述】:

分享一个我遇到过(现在已经解决)的问题。

在我的开发机器上,我使用 PHP 运行 IIS。我升级到 PHP7,突然我的代码不再工作,返回这个错误......

session_start():读取会话数据失败:用户(路径:C:\WINDOWS\temp)

看起来像是权限问题,对吧?因此,我花了很长时间调整 php.ini 设置并尝试更改文件夹权限 - 没有成功。

然后我意识到了一些事情。请参阅下面的答案。

【问题讨论】:

    标签: php session php-7.1


    【解决方案1】:

    我终于意识到这条消息毫无意义——应用程序使用数据库实现了自己的会话处理程序。在 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 方法有第二个参数,如果没有匹配的数据则返回。默认值为 null 并且在 PHP5 中运行良好,但在 PHP7.1 中会导致错误。一个简单的改变让它返回一个空字符串就解决了这个问题。

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

    原来如此。如果您收到有关 session_start 不起作用的警告并且您正在实现自己的会话处理程序,请尝试检查 read 方法中的代码以确保它始终返回字符串

    (注意:U_Data 只是我自己的数据工具类)

    我希望这可以节省其他人我绞尽脑汁的时间!

    【讨论】:

    • 即使手册中说返回一个字符串 (php.net/manual/en/sessionhandlerinterface.read.php),我也返回了一个空值,你为我节省了很多时间:)
    • 值得注意的是,这也是返回布尔值时的问题(false)
    • 非常感谢!我很困惑,因为 PHP 没有说明错误类型的会话数据。所以,现在我在我的自定义会话处理程序中对 return 语句使用(字符串)强制转换。
    【解决方案2】:

    我自己也遇到了同样的错误。经过大量的谷歌搜索和诅咒,它证明在我的情况下这确实是一个权限问题,尽管在我的 htdocs 根文件夹上,而不是在错误输出中提到的路径上。根文件夹权限是 700,而里面的其他所有东西都是 755(我有一个 Joomla 安装,它规定文件夹权限为 755)。修复根文件夹权限终于解决了这个问题。

    【讨论】:

    • 这是一个 Windows 讨论 - 你说的是 Unix 还是 Windows?
    • Linux,虽然我遇到的错误与 OP 的错误相同(除了 Linuxy 风格的路径规范),但显然我的解决方案正在帮助一些人,这有关系吗?
    【解决方案3】:

    经过一番挖掘,我发现 Joomla 中的这个错误可能是由于我的本地机器上没有运行 mySQL 服务器引起的。启动 mySQL 服务解决了这个问题,因此它与会话或权限无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多