Посмотрите на следующий код:
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);
}
Это только пример проблемы. Я использую ReactPHP с CakePHP и EventSource в браузере. Когда вы отправляете запрос, PHP несколько раз освобождает сокет, отправляя информацию в браузер до завершения скрипта. Если пользователь щелкает по второму шагу и первый шаг еще не завершен, step2 выдает ошибку, потому что не может прочитать переменную сеанса.
Я думаю, что PHP сохраняется только сессий, когда выполняется session_write_close.
register_shutdown_function('session_write_close');// CakeSession.php
Как я могу решить это?
Можно ли сохранить сессию до завершения скрипта?
Задача ещё не решена.
Других решений пока нет …