Php gcloud上未调用会话\u设置\u保存\u处理程序写入函数

Php gcloud上未调用会话\u设置\u保存\u处理程序写入函数,php,mysql,session,gcloud,session-set-save-handler,Php,Mysql,Session,Gcloud,Session Set Save Handler,我在谷歌云平台上以标准模式使用php运行应用程序。 我使用session\u set\u save\u处理程序将会话存储在mysql数据库中 .php文件 ... $mysqli = new mysqli($config->host, $config->user, $config->password, $config->db, $port, $socket); // test connection, works fine. $mysqli->query("

我在谷歌云平台上以标准模式使用php运行应用程序。 我使用
session\u set\u save\u处理程序
将会话存储在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
。。。
$mysqli=newmysqli($config->host,$config->user,$config->password,$config->db,$port,$socket);
//测试连接,工作正常。
$mysqli->query(“插入到`sessions`(`ID`、`SessionID`、`Data`、`datetoucted`)值中(NULL,'aaa1','aa1','21');
$CurrentTime=time();
函数sess\u open($sess\u路径,$sess\u名称){
echo“会话打开-sess_路径:.$sess_路径.”会话名称..$sess_名称.“
”; 返回true; } 函数sess_close(){ 回显“会话关闭”。
; 返回true; } ... 函数sess\u write($sess\u id,$data){ 全球$mysqli; 回显“会话写入”;//从未调用 $CurrentTime=time(); $mysqli->query(“更新会话集数据='$Data',datetoucted=$CurrentTime,其中SessionID='$sess_id';”; 返回true; } ... 会话设置保存处理程序(“sess_打开”、“sess_关闭”、“sess_读取”、“sess_写入”、“sess_销毁”、“sess_gc”); 会话_start(); $\会话['foo']=“bar”; $\会话['baz']=“袋熊”; $s_w_c=会话_写入_关闭(); var_出口($s_w_c);//在gcloud上为false
它在我的本地系统(MAMP)上运行良好,但在google上没有调用write函数。其他功能工作正常。 有什么想法吗


谢谢。

我不知道为什么它会在您本地的机器上工作。可能是旧版本的PHP或者没有调试文本

启动时会话发生的情况是:

会话\u开始()->打开()->读取()->全部为绿色?真:假

您在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);

注释的echos将导致启动失败。

您的代码容易受到sql注入的攻击,因此请使用带有参数的准备语句。请参阅@nbk谢谢,我会解决这个问题。mysqli连接正常吗?日志中有错误()吗?是的,没问题,将数据写入数据库(我更新了问题,测试查询工作正常)。我怀疑
$\u SESSION
在云平台上是否可信——它绑定到单个服务器上的web服务器的单个实例。