php - PHP中SessionHandlerInterface方法的返回值
问题描述
我试图了解 PHP 会话处理程序,更准确地说是SessionHandlerInterface::read
.
文档状态(强调我的):
返回读取数据的编码字符串。如果没有读取任何内容,则它必须返回 false。请注意,此值在内部返回给 PHP 进行处理。
但是,在SessionHandler 类和其他实现(例如 Symfony 的PdoSessionHandler)的文档中使用的示例似乎在无法读取任何内容时(例如第一次连接到主机时)返回一个空字符串。
为了说明这一点,我编写了一个简单的测试(为了简单起见,类继承自SessionHandler
而不是实现整体- 我知道不推荐这样做,并且示例无用:它只是在这里显示问题):SessionHandlerInterface
<?php
define('RETURN_VALUE', false);
class SimpleSessionHandler extends SessionHandler
{
public function read($id)
{
$data = parent::read($id);
if (!$data) {
return RETURN_VALUE;
} else {
return data;
}
}
}
$handler = new SimpleSessionHandler();
session_set_save_handler($handler, true);
$res = session_start();
print_r($res);
echo("Done");
false
用作返回值时,我得到一个 PHP 错误 ( Warning: session_start(): Failed to read session data
),而当我使用(''
空字符串) 时,它就像一个魅力。
我错过了什么?
我在 Fedora 33 下使用 PHP 7.4.20。
解决方案
我在 PHP 邮件列表上问了这个问题(请参阅此处的线程)。
据我了解,如果数据存在,read()
则应尝试读取数据,如果不存在则返回空字符串;只有在无法读取数据时(例如,无法创建或读取会话文件、无法访问数据库等),它才应返回 false 。
在基于某个数据库的会话处理程序的情况下,它将是这样的:
<?php
class DBSessionHandler implements SessionHandlerInterface
{
public function read($id)
{
try {
$data = $this->get_session_from_db();
if (len($data) > 0) {
// Return data
$this->serialize($data);
} else {
// Create new empty session here
try {
$this->create_empty_session_in_db();
} catch (Exception $e) {
return false;
}
return '';
}
} catch (Exception $e) {
return false;
}
}
}
我猜大多数处理程序会延迟插入write()
。
推荐阅读
- web-parts - Kentico “可编辑的 Web 部件”出现在“编辑区域和 Web 部件”下的页面中
- typescript - 如何使用 let x: type | 避免嵌套的 typescript if 语句 未定义 = 变量
- c# - C# - 将一个类克隆为一个动态的
- python - 使用 Py_SetPath() 让 Python 在不同的位置查找 Lib
- delphi - Delphi【查找声明】使用OTA
- python - 在 jupyter 笔记本上显示情节
- matlab - 在matlab中创建一个连续的日期字符串
- java - 这种语法是怎么可能的
- c# - 在中间添加枚举
- webgl - 使用 puppeteer 截取运行 WebGL 的页面