【PHP】session_start():无法读取会话数据:用户(路径:/var/lib/php/session)在…发生时的处理方法
首先
当在会话处理程序中进行会话管理时,调用session_start()会引发以下错误。
session_start(): Failed to read session data: user (path: /var/lib/php/session) in ...
本文列举了错误的原因和解决方法作为备忘录。
导致这一现象的因素
会话处理程序的实施流程
-
- session_set_save_handler関数を定義
-
- 関数の説明は公式を参照
-
- session_set_save_handler関数にSessionHandlerInterfaceインタフェースを実装したクラスのオブジェクトを渡す
- SessionHandlerInterfaceを実装するには、以下の6つのメソッドを実装する
-
- 关闭(): bool
-
- 销毁(string $sessionId): bool
-
- 垃圾回收(int $lifetime): bool
-
- 打开(string $savePath, string $sessionName): bool
-
- 读取(string $sessionId): string
- 写入(string $sessionId, string $data): bool
根据”今回のエラーの原因はFailed to read session data〜の通り、readメソッドの部分が該当していると読み取れる”,在搜索官方的session_start函数中是否提到了关于错误消息的部分,找到了以下内容。
If you are using a custom session handler via session_set_save_handler() then calling session_start() in PHP 7.1 you might see an error like this:
session_start(): Failed to read session data: user (path: /var/lib/php/session) in ...
As of this writing, it seems to be happening in PHP 7.1, and things look OK in PHP7.0.
It is also hard to track down because if a session already exists for this id (maybe created by an earlier version of PHP), it will not trigger this issue because the $session_data will not be null.
The fix is simple... you just need to check for 'null' during your read function:
<?php
function read($id)
{
//... pull the data out of the DB, off the disk, memcache, etc
$session_data = getSessionDataFromSomewhere($id);
//check to see if $session_data is null before returning (CRITICAL)
if(is_null($session_data))
{
$session_data = ''; //use empty string instead of null!
}
return $session_data;
}
?>
看起来,返回值为null导致了这次错误的发生的样子…
应对之策
根据先前的搜索结果参考,检查返回值是否为null,如果为空,则返回空字符串。
//check to see if $session_data is null before returning (CRITICAL)
if(is_null($session_data))
{
$session_data = ''; //use empty string instead of null!
}
return $session_data;
结束了
在调用read方法获取数据库时,如果返回结果为0条数据,之前将返回值设为null,因此导致了本次错误的发生。在解决错误后,我仔细查看了官方read方法的说明,发现当没有获取到有效数据时应返回空字符串。
回调函数必须返回一个经过会话编码(序列化)的字符串。如果没有读取到任何数据,就返回空字符串。