【发布时间】:2021-07-05 21:24:21
【问题描述】:
我在标准模式下使用 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) 上运行良好,但在 google 上没有调用 write 函数。其他功能正常。 有什么想法吗?
谢谢。
【问题讨论】:
-
您的代码对于 sql 注入是易受攻击的,因此请使用 带参数的准备好的语句参见stackoverflow.com/questions/60174/…
-
@nbk 谢谢,我会解决的。
-
mysqli 连接正常吗?日志中有任何错误(github.com/php/php-src/blob/master/php.ini-production#L97)?
-
是的,没关系,将数据写入数据库(我已经更新了问题,测试查询工作正常)。
-
我怀疑
$_SESSION在云平台上是否可信——它与单个服务器上的单个 Web 服务器实例绑定。
标签: php mysql session gcloud session-set-save-handler