首页 > 解决方案 > 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。

标签: phpsession

解决方案


我在 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()


推荐阅读