[PHP & MySQL] 현재 접속자수 구하기

Posted at 2012.07.28 23:16 | Posted in 프로그래밍

설명하기 귀찮으니 바로 소스 작성에 들어가기전에 데이터베이스에 간단한 테이블을 작성하자.

CREATE TABLE IF NOT EXISTS `visitor_live` (
  `ip` int(10) unsigned NOT NULL,
  `url` varchar(100) NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ip`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;

이제 php로 현재 접속자의 위치와 수를 구하는 소스를 작성할것이다.

class Visitor
{
	function __construct() {
		global $db;
		$ip = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR']));
		$url = addslashes($_SERVER['REQUEST_URI']);
		$db->query('delete from visitor_live where date < date_add(now(), interval -5 minute)');
		$db->query('insert into visitor_live (ip, url) values ('.$ip.', "'.$url.'") on duplicate key update url = "'.$url.'"');
	}

	public static function live($mod) {
		global $db;
		switch($mod) {
			case 'count':
				$query = $db->query('select count(ip) from visitor_live');
				list($count) = $query->fetch_row();
				return $count;
			case 'list':
				$query = $db->query('select * from visitor_live');
				return $query->fetch_all();
		}
	}
}


Visitor::live('count'); // 4명 접속해있으면 4 반환
Visitor::live('list'); // 4명 접속해있으면 각각의 IP, 보고있는페이지, 최근 접속 시각 정보를 담은 배열 반환

요새 객체 지향에 빠져서 현재 접속자 정보 확인만을 위한 클래스 하나를 작성해버렸다! 생각했던 길이보다 훨씬 짧게 나와서 내심 안심했다. 아무리 짧게 나왔다고 해도 위 클래스의 사용법은 알거라 믿는다. ajax로 비동기식 전송을 주기적으로 뿌려주면 새로고침하지않아도 접속자수가 갱신되는 매직을 볼 수 있을 것 같다.

저작자 표시 비영리
신고
  1. 비밀댓글입니다
  2. 비밀댓글입니다
    • 2013.02.11 17:46 신고 [Edit/Del]
      lol.. __construct()는 클래스 생성 될 때 실행됩니다.
      데이터베이스 테이블을 작성하셨는지, url 필드 길이가 너무 짧지않은지 확인하세요.
      echo (string)Visitor::live('count'); 하면 보일겁니다.
  3. 비밀댓글입니다
    • 2013.02.14 05:19 신고 [Edit/Del]
      php확장에 mysqli가 등록되있어야 한다는 점.
      db에 쓰기 권한을 가진 계정으로 로그인 해야 한다는 점.
      사용하는 php버전이 해당 함수를 지원하지 않을 수 있다는 점.

      잘 확인해보세요.. 멀리있어서 전 잘 모르겠네요.
      DB가 벅차면 파일로 현재 사용자 아는 것도 있습니다.
  4. 쟁쟁
    위 php 를 include 해서 뿌려주는건 알겠는데
    만약 사용자가 인터넷창을 닫았을때 테이블의 값을 비워야 할텐데 어떻게 지우죠?
    로그아웃 이라는 버튼을 이용하여 php 를 작성할 순 있겠지만
    사용자가 사람이라면 인터넷창을 그냥 닫는 경우가 생길겁니다.
    그럼 그 사용자가 다시 접속하여 테이블을 최신화 시키지 않는다면 그 사용자는 계속 접속되어 있는걸로 표기되는거 아닌가요?
    • 2013.05.12 17:18 신고 [Edit/Del]
      정확히 집어내셨네요.
      이 방법은 페이지 탐색시에만 테이블이 업데이트 되는 문제가 있습니다.
      그러니 crond나 taskschd.msc를 사용,
      주기적으로 오래된 레코드를 삭제하도록 하면 그나마 더 정확한 활성화 상태 파악이 될거라 생각합니다.
  5. 로젠
    이거 어떻게 규현하는건가여 테이블 만드는것부터 모르겟네요
    • 2014.02.19 16:30 신고 [Edit/Del]
      테이블을 작성하자고 한 글 바로 밑 상자는 sql입니다.
      db에 sql을 적용하세요.
      php 코드에서 엔간한 부분은 댓글에서 다~ 다~ 설명해놨습니다.

Name __

Password __

Link (Your Website)

Comment