0

我在标准模式下使用 php 在谷歌云平台上运行应用程序。我用来session_set_save_handler将会话存储在 mysql 数据库中。

.php 文件

...
$mysqli = new mysqli($config->host, $config->user, $config->password, $config->db, $port, $socket);

// test connection, works fine.
$mysqli->query("INSERT INTO `sessions` (`ID`, `SessionID`, `Data`, `DateTouched`) VALUES (NULL, 'aaa1', 'aa1', '21')");

$CurrentTime = time();

function sess_open($sess_path, $sess_name) {

    echo "session open - sess_path: " . $sess_path . "session_name " . $sess_name . "<br />";
    return true;
}

function sess_close() {
    echo "session close" . "<br />";
    return true;
}
    ...
    function sess_write($sess_id, $data) {
        GLOBAL $mysqli;
    
        echo 'session write';// never called
    
        $CurrentTime = time();
        $mysqli->query("UPDATE sessions SET Data = '$data', DateTouched = $CurrentTime WHERE SessionID = '$sess_id';");
        return true;
    }
    ...

    session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
    session_start();
    
    $_SESSION['foo'] = "bar";
    $_SESSION['baz'] = "wombat";
    
    $s_w_c = session_write_close();
    var_export($s_w_c); // false on gcloud

它在我的本地系统(MAMP)上运行良好,但在谷歌上没有调用 write 函数。其他功能正常。任何想法?

谢谢。

4

2 回答 2

0

如果数据被正确写入数据库,那么它无法在写入处理程序中看到回显输出的原因是,正如文档中所述,该处理程序直到输出流关闭后才会执行,所以调试语句的输出永远不会在浏览器中看到。

如果您需要调试输出,建议将调试输出写入文件作为更好的做法。

于 2021-07-05T13:24:21.583 回答
0

我不知道为什么它会在你的本地机器上工作。也许是旧版本的 PHP 或没有调试文本?

启动时会话会发生什么:

session_start() -> open() -> read() -> all_green? 真假;

您在 open 函数中使用 echo ,因为 session_start() 需要在任何输出之前调用,它会失败并关闭会话。内部检查位于读取功能之后。下面是一个简单的测试代码:

class Session implements SessionHandlerInterface {

    public function __construct(&$mysql) { }

    function open($path, $name) {
        //echo "session open" . PHP_EOL;
        return true;
    }

    function close() {
        echo "session close" . PHP_EOL;
        return true;
    }

    function write($id, $data) {
        echo 'session write' . PHP_EOL;
        return true;
    }

    function read($id) { 
        //echo "session read" . PHP_EOL;
        return ""; 
    }

    function destroy($id) {
        echo "session Destroy" . PHP_EOL;
        return true;
    }

    function gc($lifetime) {
        echo "session gc" . PHP_EOL;
        return true;
    }
}
    $dummy_connection = true;
    session_set_save_handler(new Session($dummy_connection), true);
    session_start();
    
    $_SESSION['foo'] = "bar";
    $_SESSION['baz'] = "wombat";
    
    $s_w_c = session_write_close();
    var_export($s_w_c);

注释的回声将导致启动失败。

于 2021-06-05T22:46:46.653 回答