Return PHP 中 SessionHandlerInterface 方法的值
Return value of SessionHandlerInterface methods in PHP
我正在尝试了解 PHP 会话处理程序,更准确地说是 SessionHandlerInterface::read
的 return 值。
The doc 状态(强调我的):
Returns an encoded string of the read data. If nothing was read, it must return false. Note this value is returned internally to PHP for processing.
但是,the documentation of the SessionHandler class and other implementation (for instance Symfony's PdoSessionHandler) 中使用的示例似乎 return 一个空字符串,当无法读取任何内容时(例如第一次连接到主机时)。
为了说明这一点,我写了一个简单的测试(class 继承自 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
作为 return 值时,出现 PHP 错误 (Warning: session_start(): Failed to read session data
) 而当我使用 ''
(空字符串)时它就像一个魅力。
我错过了什么?
我在 Fedora 33 下使用 PHP 7.4.20。
我在 PHP 邮件列表上问了这个问题(参见线程 here)。
根据我的理解,read()
应该尝试读取数据(如果存在)或 return 一个空字符串(如果不存在);它应该 return 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()
中的插入。
我正在尝试了解 PHP 会话处理程序,更准确地说是 SessionHandlerInterface::read
的 return 值。
The doc 状态(强调我的):
Returns an encoded string of the read data. If nothing was read, it must return false. Note this value is returned internally to PHP for processing.
但是,the documentation of the SessionHandler class and other implementation (for instance Symfony's PdoSessionHandler) 中使用的示例似乎 return 一个空字符串,当无法读取任何内容时(例如第一次连接到主机时)。
为了说明这一点,我写了一个简单的测试(class 继承自 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
作为 return 值时,出现 PHP 错误 (Warning: session_start(): Failed to read session data
) 而当我使用 ''
(空字符串)时它就像一个魅力。
我错过了什么?
我在 Fedora 33 下使用 PHP 7.4.20。
我在 PHP 邮件列表上问了这个问题(参见线程 here)。
根据我的理解,read()
应该尝试读取数据(如果存在)或 return 一个空字符串(如果不存在);它应该 return 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()
中的插入。