Обработчик сеансов базы данных CakePHP и реактивное программирование

Посмотрите на следующий код:

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

Как я могу решить это?

Можно ли сохранить сессию до завершения скрипта?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]