1

看下面的代码:

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

我该如何解决这个问题?

是否可以在脚本完成之前保存会话?

4

0 回答 0