2016-12-30 1 views
0

내가 데이터베이스에서 세션 데이터를 저장하고 읽어 사용자 지정 세션 처리기 사용 : 사용자가 로그인 한 경우PHP는 세션이 무작위로

class c_session implements SessionHandlerInterface { 

    private $db; // Database 

    // Constructor 
    public function __construct($database){ 
     $this->db = $database; 

     session_set_save_handler(
      array($this, 'open'), 
      array($this, 'close'), 
      array($this, 'read'), 
      array($this, 'write'), 
      array($this, 'destroy'), 
      array($this, 'gc') 
     ); 
     register_shutdown_function('session_write_close'); 
    } 

    // Custom made session start 
    public function start_session() { 
     global $globals; // Included in config.php 

     // Make sure the session cookie is not accessible via javascript. 
     $httponly = true; 

     // Force the session to only use cookies, not URL variables. 
     ini_set('session.use_only_cookies', 1); 

     // Get session cookie parameters and set the parameters 
     $cookieParams = session_get_cookie_params(); 
     session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $globals['https'], $httponly); 

     // Change the session name 
     session_name($globals['session_name']); 

     // Now we can start the session 
     session_start(); 
    } 
... 

모든 웹 페이지에서를, 내가 확인하는 세션을 읽어

function signin_check($db, $session) { 
    global $globals; // Included in config.php 
    $session->start_session(); 
    try { 
     // Check if all session variables are set 
     if(isset($_SESSION['A'], $_SESSION['B'])) { 
... 

그녀가 로그인하지 않은 경우, 그녀는 로그 아웃됩니다.

변수 $_SESSION['A']$_SESSION['B']은 로그인 페이지에서 설정됩니다.

시스템은 완벽하게 99 %의 시간 동안 작동하지만 때로는 웹 페이지를 변경할 때 임의로 로그 아웃됩니다. 이는 (알려진) 이유가없는 경우 $_SESSION['A']$_SESSION['B']이 설정되어 있지 않기 때문에 발생합니다.

왜 이러한 로그 아웃을 방지 할 수 있습니까?

+0

언뜻보기에 세션이 끝난 것처럼 들립니다. php.ini 설정을 검사 할 수 있다면 session.cookie_lifetime과 session.gc_maxlifetime에 무엇이 설정되어 있는지 알 수 있습니까? – Raf

답변

0

@Rat이 주석에서 지적한대로 세션 시간이 초과되었거나 어떤 이유에서든 $_SESSION["A"] 또는 $_SESSION["b"] 코드 덩어리가 있습니다. 이런 일이 일어나는 페이지를 확인하십시오. 로그 아웃하지 않고 해당 페이지를 방문 할 수 있지만 "때때로"로그 아웃하는 경우 설정에 문제가 있습니다. 그렇지 않으면 페이지의 코드를 조사하여 어디에서 로그 아웃했는지 확인해야합니다.

+0

php.ini 설정이 기본 nginx 설정입니다. 내가 만든 유일한 변경 사항은 다음과 같습니다. session.cookie_httponly = 1, \t session.cookie_secure = 1. PHP를 사용하고 있습니다. 문제는 일부 페이지를 제외하지 않고 때때로 발생합니다. 나는 그것이 경쟁 조건에 기인한다고 생각한다. –

+0

@Medicalphysicist session.cookie_lifetime 및 session.gc_maxlifetime의 값은 무엇입니까? –

+0

session.cookie_lifetime = 0, session.gc_maxlifetime = 1440 –