Php gcloud上未调用会话\u设置\u保存\u处理程序写入函数
我在谷歌云平台上以标准模式使用php运行应用程序。 我使用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("
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服务器的单个实例。