Browse Source

Fixed session bug.

tags/2.0.0-beta
Qiang Xue 12 years ago
parent
commit
5d6c9a4c9f
  1. 10
      framework/web/Session.php

10
framework/web/Session.php

@ -84,6 +84,8 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co
return false; return false;
} }
private $_opened = false;
/** /**
* Starts the session. * Starts the session.
*/ */
@ -92,10 +94,12 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co
// this is available in PHP 5.4.0+ // this is available in PHP 5.4.0+
if (function_exists('session_status')) { if (function_exists('session_status')) {
if (session_status() == PHP_SESSION_ACTIVE) { if (session_status() == PHP_SESSION_ACTIVE) {
$this->_opened = true;
return; return;
} }
} }
if (!$this->_opened) {
if ($this->getUseCustomStorage()) { if ($this->getUseCustomStorage()) {
@session_set_save_handler( @session_set_save_handler(
array($this, 'openSession'), array($this, 'openSession'),
@ -110,19 +114,23 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co
@session_start(); @session_start();
if (session_id() == '') { if (session_id() == '') {
$this->_opened = false;
$error = error_get_last(); $error = error_get_last();
$message = isset($error['message']) ? $error['message'] : 'Failed to start session.'; $message = isset($error['message']) ? $error['message'] : 'Failed to start session.';
Yii::error($message, __CLASS__); Yii::error($message, __CLASS__);
} else { } else {
$this->_opened = true;
$this->updateFlashCounters(); $this->updateFlashCounters();
} }
} }
}
/** /**
* Ends the current session and store session data. * Ends the current session and store session data.
*/ */
public function close() public function close()
{ {
$this->_opened = false;
if (session_id() !== '') { if (session_id() !== '') {
@session_write_close(); @session_write_close();
} }
@ -149,7 +157,7 @@ class Session extends Component implements \IteratorAggregate, \ArrayAccess, \Co
return session_status() == PHP_SESSION_ACTIVE; return session_status() == PHP_SESSION_ACTIVE;
} else { } else {
// this is not very reliable // this is not very reliable
return session_id() !== ''; return $this->_opened && session_id() !== '';
} }
} }

Loading…
Cancel
Save