请查看以下代码:
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');
}
如果执行step1操作,则休眠5秒,然后执行step2,结果为“Fail”。这意味着在我调用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);
}
这只是问题的一个例子。我在浏览器中使用了带有CakePHP和EventSource的ReactPHP。当您发送请求时,PHP会在脚本完成之前多次向浏览器发送信息。如果用户单击第二步并且第一步尚未完成,则step2会抛出错误,因为它无法读取会话变量。
我认为PHP只会在执行session_write_close时持续存在会话。
register_shutdown_function('session_write_close');// CakeSession.php
我该如何解决这个问题?
是否可以在脚本完成之前保存会话?