php无法检测到已存在的会话,因此无法根据新请求运行session_start

问题描述

我在index.PHP的开头按如下所述开始会话

<?PHP
if ( !isset($_SESSION) ) {
    ini_set( 'session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/tmp'));
    umask(0);
    // session_status(); >> 1
    session_start();
}

并使用2个类,第一个类设置会话,第二个类读取会话

Login.PHP

<?PHP

class Login
{
    public function getUser() {

        if ( isset($_POST['username']) && $_POST['username'] === "test" ) {

            $_SESSION['current_user'] = "test";
            // session_status(); >> 2

            ?>
        
            {
                "status": true
            }
    
            <?PHP
    
        } else {

            ?>

            {
                "status": false
            }
    
            <?PHP
    
        }

通过运行此脚本,将在上述路径中以sess_to43...的形式创建一个新的会话文件,其中包含current_user|i:test; 到目前为止,我有一个会话文件

然后在第二类中,在登录类响应后立即由前端调用

Auth.PHP

<?PHP

class Auth
{
    public function getSession() {

        var_dump($_SESSION);

    }

返回NULL,当我查看服务器上的会话目录时,可以看到新的会话文件为空,这意味着PHP再次运行session_start(),因此 甚至以为我在开始和两节课之前都使用过session_start()PHP无法识别当前存在的会话

此外,如您所见,我为会话文件设置了不同的路径,并且所有新会话都正确存储在此目录中,但是此简单脚本无法处理会话

PHP.ini中是否有任何原因,或者Apache服务器导致每个新请求的未创建会话都没有建立?

P.S。 PHP版本:7.4

解决方法

您的问题就在这里

    echo session_status(); // 1
    session_start();

您在开始会话之前将输出发送到浏览器。试试:

    $x = session_status(); // 1
    session_start();
    echo $x;