【发布时间】:2017-05-23 06:12:28
【问题描述】:
分享一个我遇到过(现在已经解决)的问题。
在我的开发机器上,我使用 PHP 运行 IIS。我升级到 PHP7,突然我的代码不再工作,返回这个错误......
session_start():读取会话数据失败:用户(路径:C:\WINDOWS\temp)
看起来像是权限问题,对吧?因此,我花了很长时间调整 php.ini 设置并尝试更改文件夹权限 - 没有成功。
然后我意识到了一些事情。请参阅下面的答案。
【问题讨论】:
分享一个我遇到过(现在已经解决)的问题。
在我的开发机器上,我使用 PHP 运行 IIS。我升级到 PHP7,突然我的代码不再工作,返回这个错误......
session_start():读取会话数据失败:用户(路径:C:\WINDOWS\temp)
看起来像是权限问题,对吧?因此,我花了很长时间调整 php.ini 设置并尝试更改文件夹权限 - 没有成功。
然后我意识到了一些事情。请参阅下面的答案。
【问题讨论】:
我终于意识到这条消息毫无意义——应用程序使用数据库实现了自己的会话处理程序。在 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 只是我自己的数据工具类)
我希望这可以节省其他人我绞尽脑汁的时间!
【讨论】:
我自己也遇到了同样的错误。经过大量的谷歌搜索和诅咒,它证明在我的情况下这确实是一个权限问题,尽管在我的 htdocs 根文件夹上,而不是在错误输出中提到的路径上。根文件夹权限是 700,而里面的其他所有东西都是 755(我有一个 Joomla 安装,它规定文件夹权限为 755)。修复根文件夹权限终于解决了这个问题。
【讨论】:
经过一番挖掘,我发现 Joomla 中的这个错误可能是由于我的本地机器上没有运行 mySQL 服务器引起的。启动 mySQL 服务解决了这个问题,因此它与会话或权限无关。
【讨论】: