次のコードを見てください。
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 を実行すると、結果は「失敗」になります。つまり、書き込みメソッドを呼び出した瞬間にセッション変数を保持していません。
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 はブラウザに情報を送信するためにソケットを数回解放します。ユーザーが 2 番目のステップをクリックし、最初のステップがまだ完了していない場合、step2 はセッション変数を読み取ることができないため、エラーをスローします。
session_write_close が実行されている場合、PHP はセッションのみを保持すると思います。
register_shutdown_function('session_write_close');// CakeSession.php
どうすればこれを解決できますか?
スクリプトが終了する前にセッションを保存することはできますか?