看下面的代码:
public function step1 (){
$this->Session->write('test.test', 1);
sleep(10);
}
public function step2 () {
if($this->Session->read('test.test')){
$this->response->body('Great');
}else{
$this->response->body('Fail');
}
}
public function remove () {
$this->Session->delete('test.test');
}
如果您执行第 1 步操作,休眠 5 秒,然后执行第 2 步,结果为“失败”。这意味着在我调用 write 方法的那一刻不会持久化会话变量。
如果你看一下 CakePHP DatabaseSession 类,你会发现:
public function write($id, $data) {
if (!$id) {
return false;
}
$expires = time() + $this->_timeout;
$record = compact('id', 'data', 'expires');
$record[$this->_model->primaryKey] = $id;
return $this->_model->save($record);
}
这只是问题的一个例子。我在浏览器中将 ReactPHP 与 CakePHP 和 EventSource 一起使用。当您发送请求时,PHP 会在脚本完成之前多次释放套接字向浏览器发送信息。如果用户点击到第二步,而第一步还没有完成,那么 step2 会抛出一个错误,因为它无法读取会话变量。
我认为 PHP 只在 session_write_close 执行时保留会话。
register_shutdown_function('session_write_close');// CakeSession.php
我该如何解决这个问题?
是否可以在脚本完成之前保存会话?