分享我遇到的一个问题(现在已经解决了)。
在我的开发机器上,我使用 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方法中的代码以确保它始终返回 string。
(注:U_Data 只是我自己的数据实用程序类)
我希望这可以节省其他人我绞尽脑汁的时间!
我自己也遇到了同样的错误。经过大量的谷歌搜索和诅咒,证明在我的情况下这确实是一个权限问题,尽管在我的 htdocs 根文件夹上,而不是在错误输出中提到的路径上。根文件夹权限为 700,而其中的所有其他内容为 755(我有一个 Joomla 安装,它规定文件夹权限为 755)。修复根文件夹权限终于解除了这个问题。
经过一番挖掘,我发现 Joomla 中的这个错误可能是由于我的本地机器上没有运行 mySQL 服务器引起的。启动 mySQL 服务解决了这个问题,因此它与会话或权限无关。