제목 | 세션 Expired와 가비지 컬렉터 질문 | ||
---|---|---|---|
글쓴이 | 2전산2 | 작성시각 | 2014/01/17 02:33:04 |
|
|||
[php 버전 : 5.4.21, apach 2.4, CI 2.1.4 입니다.] 안녕하세요? 메일 보기만 하다가 처음으로 질문 올리네요^^ 다름이 아니라, 현재 운영하고 있는 사이트에서 특정 시간이 지나거나 또는 꽤 높은 확률로 ajax 실패시 또는 http 요청시 세션이 사라져서, 로그인이 끊기는 현상이 간헐적으로 발생하고 있습니다. 그래서 의심되는 부분을 여쭤보려고 합니다. 아래 코드는 CI_Session 클래스의 일부분인데요~ constructor 에서 매번 $this->_sess_gc(); 하는 것을 확인할 수 있는데요. _sess_gc 함수에서는 디비세션을 사용할 경우 5%의 확률(페이지 요청 시)로 오래된 디비세션을 제거하는 쿼리를 수행하고 있습니다. 동접자가 꽤 있을 경우 이런식으로 세션을 처리하게 되면 접속한지 오래되지 않은 사용자라도 상대적으로 세션이 날아갈 수 있는 확률이 있지 않나요? 이 부분의 의심되어 한참 들여다 보고 있는데 디버깅이 쉽지가 않네요.. 많은 조언 부탁 드립니다. ^^ class CI_Session { var $sess_encrypt_cookie = FALSE; var $sess_use_database = FALSE; var $sess_table_name = ''; var $sess_expiration = 7200; var $sess_expire_on_close = FALSE; 중략.... public function __construct($params = array()) { 중략.... $this->_sess_gc(); } /** * Garbage collection * * This deletes expired session rows from database * if the probability percentage is met * * @access public * @return void */ function _sess_gc() { if ($this->sess_use_database != TRUE) { return; } srand(time()); if ((rand() % 100) < $this->gc_probability) { $expire = $this->now - $this->sess_expiration; $this->CI->db->where("last_activity < {$expire}"); $this->CI->db->delete($this->sess_table_name); log_message('debug', 'Session garbage collection performed.'); } } } |
|||
다음글 | 인트라넷 도메인? (1) | ||
이전글 | AWS 인스턴스에 svn을 구축 중입니다 (3) | ||
2전산2
/
2014/01/17 02:39:37 /
추천
0
세션 관련 설정은 다음과 같이 되어 있습니다.
$config['sess_cookie_name'] = 'test'; $config['sess_expiration'] = 7200; $config['sess_expire_on_close'] = TRUE; $config['sess_encrypt_cookie'] = TRUE; $config['sess_use_database'] = TRUE; $config['sess_table_name'] = 'test'; $config['sess_match_ip'] = FALSE; $config['sess_match_useragent'] = FALSE; $config['sess_time_to_update'] = 600;
|
pwrlove
/
2016/09/11 00:41:35 /
추천
0
너무 오래전 질문이긴한데, 아무도 답을 달지 않아서...., _sess_gc();는 세션 객체가 생성될때마다 계속 호출되는 것은 맞습니다. 근데, 아무리 많이 호출되어도, 실제 계산된 $expire값을 이용해 세션 테이블값을 조회해서 last_activity값이 7200초가 넘은 값은 모두 삭제하도록 되어 있어서 실제 세션레코드는 호출되는 횟수와는 상관이 없어 보입니다. sess_update() 가 적당히 호출되어서 $expire = $this->now - $this->sess_expiration; $this->CI->db->where("last_activity < {$expire}"); last_activity 값이 갱신되어서 위의 조건에 걸리지 않으면 테이블에서 삭제되지 않을 겁니다. 그런데, 종종 아무때나 세션이 삭제되는 것 같이 보이긴 하던데 이건 버그일까요? |