개발 Q&A

제목 session 을 활용한 사이트 접속자 체크기능
카테고리 PHP
글쓴이 루비콘 작성시각 2017/07/25 16:45:13
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 15672   RSS

안녕하세요 말그대로 session 을 활용하여 사이트 접속자를 보여주는

기능를 개발중에 막히게 되어 문의드립니다!!

 

사진과 같이 보이시는대로 네이버 카페 같은곳에서 볼 수 있는 기능입니다.

해당 카페에 우리쪽회원 누가 몇명이나 접속을 했는지 볼 수 있는 그런 기능입니다.

 

똑같은 기능을 구현해보려고 하는데

도저히 로직이 서지 않아 문의 드립니다.

 

현재 session 의 셋팅 모습입니다.(config.php)

$config['sess_cookie_name']		= 'ci_session';
$config['sess_expiration']		= -1;
$config['sess_encrypt_cookie']	= FALSE;
$config['sess_use_database']	= FALSE;
$config['sess_table_name']		= 'ci_sessions';
$config['sess_match_ip']		= FALSE;
$config['sess_match_useragent']	= FALSE;
$config['sess_time_to_update'] 	= 300;

 

추가로 컨트롤러의 소스입니다.

session_start();

	if($this->CI->session->userdata('user_id')){
		$data = array(
			'm_check' => 'MEMBER'
		);//접속된 아이디가 있으면 
		$this ->CI->session -> set_userdata ($data);
	}else{
		$data = array(
			'm_check' => 'GUEST'
		);//접속된 아이디가 없으면
		$this ->CI->session -> set_userdata ($data);
	}

 

해당 형식으로 회원과 비회원을 분기 시키는것 까진 완료되었지만

현재 접속중인 회원의 수를 도저히 어떻게 카운팅 해야하는지 감이 잡히질 않아 

질문드립니다.

echo count($_SESSION['m_check']);

의 방법은 전혀 아닌거 같고..초급 개발자에겐 session 은 험난하기만 하네요 ㅠ

 

혹시 어떤방법을 사용하여 session 들을 가공해야 하는지 도와주시면 감사하겠습니다 ㅠ

 

추가

현재 DB에도 저장이 되어지고 있습니다

 

 다음글 파일 업로드시 문제입니다. (5)
 이전글 외부에 연결되어 트래픽 발생시키는 원인 알아내는 방법 (5)

댓글

amen / 2017/07/25 17:10:30 / 추천 0
db 세션 사용하셔서 저 세션 테이블을 alter 해서 user_id 넣는 칸을 만들고 로그인할때 생성된 세션에  user_id 를 같이 넣으세요. 그리고 살아있는 세션 검색해서 접속한 사람 표시해주면 되지않을까요 ? .  user_id 넣는 방법은  system->libraries -> session->driver-> session_database_driver.php 246번째 줄정도( function write) 보시면 될거에요. 전 3.1.0 기준으로 말씀드려요 
루비콘 / 2017/07/25 17:15:00 / 추천 0

amen님 안녕하세요 우선답변 감사드립니다.

제가 어려워하는 부분은 그 살아있는 세션의 수를 카운팅 하는 방법?을 잘 모르겠어서...ㅠ

혹시 다른분들은 어떤방식으로 session 테이블들의 수많은 session들 중에서 살이있는 session 을 찾아내는지가 궁금해서

검색을 엄청 해보았지만 딱히 방법이 없어서 혹시 방법을 아시는 분들이 있을까하여 질문드렸습니다 ㅠ

변종원(웅파) / 2017/07/26 08:49:57 / 추천 0

루비콘/ amen님이 방법을 다 알려주셨는데요? 세션테이블에 user_id 넣는 컬럼을 만들고

로그인하면 값이 있을거고 안하면 값이 없겠죠. ^^;

루비콘 / 2017/07/26 09:42:47 / 추천 0

웅파님 안녕하세요 답변 감사합니다.

허면 실시간으로 체크를 헤야하는데(현재 접속중인 회원들을 나타내려면) 세션을 잃은 회원들 즉 창을 종료한 회원들은 어떻게 알 수 있을까요?

다른 방법이 있나요?

변종원(웅파) / 2017/07/26 10:28:35 / 추천 0

매뉴얼을 읽어보시길 바랍니다. 창 닫으면 세션 종료하는 옵션이 있습니다.

그리고 db세션 가지고 현재 접속자를 체크하려면 어찌 됐건 지속적으로 값을 찾아와야 합니다. 방식 자체가 무리가 있는 방식을

선택하신거구요. node.js를 이용하거나 구글 analitics처럼 30분의 유효기간을 가지는 쿠키를 기반으로 하는 체크처럼

다른 방식을 사용해야합니다.

그리고 php 특히 웹 특성상 apache+php만으로는 정확한 접속자를 잡아낼 수가 없습니다.

사용자가 창을 종료하지 않고 비정상적으로 종료되는 경우라던가 인터넷이 끊기는 경우라던가..

저런 케이스를 어떻게 예외처리할 것인지 고민하고 만들어야 하는데 단순히 로그인 db 세션으로 처리하려니까 

머리가 아파지는 겁니다. ^^

슘님 / 2017/07/26 20:57:21 / 추천 0

실시간 처리라기 보다는 주기적인 폴링이 필요합니다. (자바스크립트로)

예를 들면 30초마다 주기적으로 헬스체크 신호를 서버에 보내고 응답으로 현재 헬스체크를 지속적으로 보내는 세션들만 보내주고...

서버에서는 일정 시간(예를 들면 1분) 안에 헬스체크가 없다면 페이지를 떠난 것으로 간주하고 해당 세션 정보를 지워야겠죠.

(여기서 말하는 세션은 로그인 세션과는 구분됩니다. 접속자수를 보여주려는 페이지에 머무르고 있는가를 얘기합니다.)

헬스체크가 없는 세션을 지우는 방법은 크론같은걸 활용하셔도 됩니다. (1분 주기라든가)

더 짧은 주기로 하시고 싶으면 백그라운드에서 도는 프로그램 만들어도 되고요. (방법은 여러가지 있습니다.)

DB보다는 redis나 memcached와 같은 in-memory storage를 사용하시는 것을 추천드립니다. 

마PD / 2017/07/26 21:56:12 / 추천 0

저도 실시간 방문자를 어떻게 뿌려줄지 관심이 있어서 답변들을 계속 보고 있는데...

쉬운게 없군요 ㅜㅜ 자바스크립트로는 조금 해볼만 할거 같긴 합니다 ...