본문 바로가기

Web Development/PHP

[PHP] 카운터 만들기

카운터란?
카운터는 홈페이지에 접속하는 사람들의 수를 나타내는 프로그램입니다.
대부분의 경우 오늘의 접속자 수와 지금까지의 총 접속자 수를 표시합니다.
일반적으로 3가지 종류의 카운터가 있습니다.

1. 일반 카운터 : 카운터가 있는 페이지를 다시 읽을때마다 매번 카운터가 1회씩 올라감.
2. 쿠키 카운터 : 쿠키라는 것을 이용해서 브라우저를 닫기전까지 단 1회만 올라감.
3. 세션 카운터 : 세션이라는 것을 이용해서 세션이 살아 있을때까지 단 1회만 올라감.

 

쿠키란?

쿠키는 과자이름이지만 과자가 아닙니다. ^^

우리는 다음이나 다른 사이트에 들어갈때 아이디와 패스워드를 넣고 들어가는 경우가 많습니다.

이는 회원만 사이트를 이용할 수 있게 하는것입니다.
다른 일반인들이 아무나 들어오지 못하게 로그인 과정을 거치게 하는 것입니다.
근데 한번 로그인을 하고 나면 브라우저를 닫거나 로그아웃을 하기 전까지는 어느 페이지에 가더라도
다시 로그인 하라는 창은 뜨지 않습니다.(특별한 경우 제외)
그 이유는 로그인 후에 접속자에게 쿠키라는것을 만들어 주었기 때문입니다.

(쿠키는 사용자컴퓨터에 저장됩니다.)

쉽게 생각해서 우리가 들어갈려고 하는 사이트를 놀이동산이라고 하면 쿠키는 자유이용권입니다.
처음에 놀이동산에 들어갈때 자유이용권을 사면(쿠키는 무료입니다.^^)

어느 놀이기구를 타더라도 그것만 보여주면 다 탈 수 있습니다.

 

참고사항


쿠키는 만료시간(소멸시간)을 지정하여 그 시간이 지나면 자동적으로 삭제되거나
만료시간을 지정하지 않은 경우에는 브라우저를 닫으면 알아서 삭제됩니다.

 

세션이란?

세션은 쿠키의 한단계 발전된 개념입니다.
쿠키는 사용자가 들어오는건 알 수 있어도 말없이 나가 버리면 나간것에 대해 알지 못합니다.

바로 윗줄에서 세션이 한 수 위라고 했습니다.
세션은 사용자가 나가버리면 조금 있다가 "어 이녀석 나가버렸군."하고 세션을 삭제합니다.
그리고 세션은 특이한 기능이 하나 더 있습니다.
놀이 동산에서 놀이기구를 안타고 그냥 멀뚱거리기만하면(페이지 이동이 없다면)
"넌 20분동안 놀이기구를 안타고 있으니 세션이 필요없나보구나." 하면서 세션을 자동적으로 삭제해 버립니다.

하지만 이런 세션도 단점은 있습니다.
세션이 사용자의 접속상태를 확인하는 등 별도의 작업을 하기때문에 서버컴퓨터가 힘들어 합니다.
PHP에서도 PHP4 버전부터 세션을 공식적으로 지원하기 시작했습니다.

PHP3버전까지는 외부 라이브러리를 사용해서 세션을 이용했습니다.

 

참고사항1

쿠키의 정보는 사용자의 컴퓨터에 저장되며 세션의 정보는 서버컴퓨터에 저장됩니다.
그렇기 때문에 쿠키의 경우 사용자에 의해 값이 변경되거나 거짓으로 생성될 수 있습니다.
로그인과 같은 것을 구현하는데 있어서 쿠키로 로그인처리를 하면 심각한 보안문제를 발생할수 있습니다.
그래서 보안이 중요시되는 부분에인 로그인처리는 서버의 컴퓨터에 정보가 저장되는 세션으로 처리합니다.

참고사항2

세션과 쿠키의 차이점

[세션]

1.보안에 강하다.

2.어떠한 브라우저에서도 사용 가능하다.


[쿠키]

1.보안에 취약하다.

2.간단한 데이터만 저장가능하다.

3.쿠키를 지원하는 브라우저에서만 사용가능하다.

 

어떤걸 이용해서 카운터를 만들까?

일반 카운터를 선택할것이냐 쿠키 카운터를 쓸것이냐 그것도 아니면 세션 카운터를 쓸 것이냐에 대해 생각해봅니다.

일반 카운터는 페이지를 볼때마다 무조건 올라가기 때문에 자료에 대한 신뢰성이 없습니다.
세션 카운터를 쓰면 서버 컴퓨터가 힘들어 한다고 했습니다.

그래서 제일 만만하고 무난한 쿠키카운로 만들어보겠습니다.

보통 대부분의 카운터가 바로 이 쿠키를 써서 만들어집니다.
쿠키를 가지고 있나 없나 여부를 확인해서 프로그램을 짜면
브라우저를 닫거나 쿠키를 삭제하기 전까진 카운터가 1밖에 안올라가게 됩니다.


쿠키를 이용해 카운터 만들기

앞선 강좌에서 쿠키를 이용해 카운터를 만들기로 했습니다.
그럼 카운터에 왜 쿠키가 필요한지는 알아 볼까요?

 

쿠키는 카운터에서 무슨일을 하나?
카운터는 홈페이지를 방문한 사용자의 수가 정확히 얼마나 되는가를 알고 싶은게 목적입니다.
대개 카운터는 메인페이지에 넣기 마련입니다.
만 약 메인페이지를 브라우저에서 불러 들일때마다
매번 카운터가 하나씩 증가한다면 엽기적인 방문자
(메인페이지에서 F5를 마구 눌러대는 사람)나 수시로 메인페이지로 가는 Home 버튼을 누르는 사람들에게 걸리면
실질적인 방문자가 10명임에도 하루방문자가 100에서 심하게는 1000까지 이르는걸로 나오게 됩니다.
당연히 이런 결과가 나오면 안되겠습니다.
 

이를 방지하기 위해서 방문자가 홈페이지에 접속해서 구석 구석을 구경하는 동안은
카운터가 안올라가게 해야한다는 생각을 누군가가 가지게 되었습니다.
그 사람은 고민을 했습니다.
어느 순간 그 사람의 머리에 "쿠키"란 단어가 떠올랐을 겁니다.
쿠키는 브라우저를 닫거나 일부러 삭제하지 않으면 안없어지니까요.

방문자가 홈페이지에 접속하면 쿠키를 손에다 쥐어주고 카운터를 하나 올립니다.
방문자가 다시 해당 페이지를 읽거나 F5(새로고침) 버튼을 누르면 쿠키를 가지고 있는지
확인을 해서 쿠키를 가지고 있으면 카운터를 올리는걸 무시하고 쿠키가 없으면 새로 접속한
사람으로 인식하고 새로 카운터를 올립니다.
이게 바로 쿠키를 이용한 카운터의 원리입니다.

 

쿠키의 사용방법

SetCookie ("쿠키이름", "쿠키값");

위와 같이 문법으로 쿠키를 사용합니다.

우리가 카운터 프로그램에서 쓰게될 쿠기의 생김새는 아래와 같습니다.

SetCookie("ip",$REMOTE_ADDR);

처음보는게 나왔습니다. 자 그럼 하나씩 알아봅시다.
쿠키이름 = ip -> $REMOTE_ADDR 입니다.

이 구문을 설명하면 쿠키이름은 먼저 ip이며 그 ip 라는 쿠키 변수에는
$REMOTE_ADDR 변수의 값이 들어간다는것입니다.
그리고 나서 쿠키변수는 사용자의 컴퓨터에 저장이 되는것입니다.

 

변수의 모양은 많이 보셨습니다. 아시다시피 변수는 $로 시작합니다.
따라서 $ip에는 $REMOTE_ADDR 이라는 값이 들어가게 됩니다.
그럼 도대체 $REMOTE_ADDR라는 변수는 무엇일까요?
$REMOTE_ADDR는 PHP에서 먼저 만들어놓고 정해져 있는 PHP 환경변수입니다.

$REMOTE_ADDR는 방문자의 IP Address를 알려주는 PHP환경변수입니다.

저의 IP가 211.45.255.123 이라면 echo $ip 의 결과는 211.45.255.123 이 나오게 될것입니다.

 

참고사항1

$REMOTE_ADDR 는 사용자의 IP를 알아내어 저장해놓은 PHP환경변수입니다.

 

참고사항2

만들어진 쿠키 변수는 사용자의 컴퓨터에 저장됩니다.

정확한 경로는 C:\Documents and Settings\사용자계정명\Cookies 폴더에 저장됩니다.


쿠키를 이용한 카운터 프로그램 테스트

1. count.txt란 파일을 PHP파일이 있는 디렉토리에 만들어 놓습니다.

vi count.txt

Esc 후 -> wq 종료

 

2. count.txt파일의 퍼미션을 777로 바꾸어 모든 사람이 읽기 쓰기 가능하게 바꾼다.

(서버가 리눅스일경우)

chmod 777 count.txt

 

3.아래 소스를 PHP파일로 저장하여 실행해보자

<?

$count = file( "count.txt");
$count = chop($count[0]);

if (!$ip)
{
    $count++;
    $fp = fopen( "count.txt",  "w");
    fwrite($fp,  "$count");
    fclose($fp);

    SetCookie( "ip",$REMOTE_ADDR);

}

echo ($count);

?>

 

쿠키를 이용한 카운터 프로그램 소스분석

<?

//## 파일이름을 줄단위로 배열로 만들어 리턴한다. ##//
$count = file("count.txt");

 

//## 배열변수의 첫번째 배열값에 처음과 끝에 공백을 제거하여 리턴한다. ##//
$count = trim($count[0]);

 

//## ip변수가 없으면 실행 ##//
if (!$_COOKIE["ip"])
{

 //## count변수 1증가 ##//
 $count++;

 

 //## count.txt 파일 열기(쓰기모드) ##//
 $fp = fopen( "count.txt",  "w");

 

 //## count변수의 값을 count.txt파일에 기록한다. ##//
 fwrite($fp,  "$count");

 //## count.txt 파일 닫기 ##//
 fclose($fp);

 

 //## 접속자 아이피를 쿠키변수 ip로 저장 ##//
 SetCookie( "ip",$REMOTE_ADDR);

}

 

//## 총 접속자 보기 ##//
echo ($count);

 

?>


카운트의 처리 흐름도

1. 파일 내용 보기

현재까지의 방문자수를 알기 위해 count.txt 파일을 열어 적혀있는 값을 가져옵니다.

 

2. 정확한 값을 가져오기

파일에서 가져온 값에서 공백을 없앱니다.

그러면 현재까지의 방문자 수를 가져와 $count 에 저장되어 있습니다.

 

3. 쿠기변수 체크

첫번째 접속인지 아니면 이미 접속되어있는 상태인지 확인합니다.
매번 페이지를 볼때마다 카운터가 올라가는 것을 방지하기 위함입니다.
이미 접속되어 있다면 쿠키값을 가지고 있습니다. 쿠키가 저장된 변수는 $ip 입니다.
$ip의 값을 확인해서 값이없으면 처음접속이고 있다면 이미 접속되어 있는것입니다.
if (!$ip) -> $ip 값이 비어 있을때  처음 접속했을때 입니다.

 

4. 카운터 증가

만약 쿠키값이 있다면 다시 카운터를 올릴 필요가 없으니 현재 방문자수를 보여줄것이며

쿠키값이 없으면 처음 접속하는 것이니 카운터를 올려주면 됩니다.

위에서 카운터는 $count 변수에 저장되어 있다고 했습니다.
그럼 $count ++; 이나 $count = $count +1; 로 $count 값에 1을 더합니다.

 

5. 파일열기

자 그럼 카운터값을 다시 저장해야합니다.

다시 count.txt 파일을 엽니다.  이번엔 fopen 이란 함수를 사용합니다.
fopen(파일 이름,파일모드) 형식으로 쓰는 겁니다.

파일모드는 w,r,w+,r+ 등등이 있는데 write(쓰기)할거냐 read(읽기)할거냐를 지정해 주는 것입니다.
우리는 파일을 새로 쓸거니깐 파일모드에 w를 쓰면 되겠습니다.

 

6. 파일내용저장

파일을 열었으니 값을 저장합니다. fwrite함수는 file을 write하는 함수입니다.

fwrite(열려진 파일의 핸들,저장하고자 하는 문자열값) 이러한 형식입니다.

 

7. 파일닫기

자 파일을 열어 저장했으니 열었던 파일을 닫습니다.
fclose함수는 파일을 닫겠다는 것입니다.
fclose(열려진 파일의 핸들) 형식입니다.

 

8. 쿠기변수 생성

카운터를 파일에 저장했으니 현재 방문자가 접속했다는 의미로 쿠키변수를 하나 생성합니다.

쿠기변수를 사용하는 이유는 연속적인 방문으로 카운터 증가가 되지 않게 하기 위해서입니다.
보통 SetCookie(쿠키를 저장할 변수,저장될 값) 의 형식으로 사용됩니다.

브라우저가 열려있는동안만 쿠키변수가 살아있으며 브라우저가 닫히면 쿠키변수는 소멸됩니다.
$REMOTE_ADDR 은 환경변수의 일종으로 브라우저가 제공해주는 값입니다.
접속자의 접속 IP를 알려줍니다.

 

9. 카운터 값 화면에 출력

자 그럼 쿠키도 하나 생성해주었으니 이제 카운터를 화면에 보여줍니다.
카운터를 출력하고 싶은 부분에다가 $count 값을 뿌려주면 됩니다.

 

참고1
쿠키는 방문자(사용자)의 컴퓨터에 저장됩니다. 서버가 쿠키를 관리하는 것이 아닙니다.
브라우저가 사용자의 컴퓨터에 저장된 쿠키를 읽어와서 브라우저의 헤더에다가 정보를 써두면
PHP 코드가 이 헤더정보를 가져와서 쿠키값을 확인하는 것입니다.

 

참고2
파일을 이용한 카운터는 소규모 사이트에만 사용이 가능합니다.

중,대규모 사이트에서는 파일을 이용한 카운터를 사용하지 않습니다. 왜냐하면........................

중,대규모 사이트에서는 동시 방문자가 많기때문에
파일을 여러명이 한꺼번에 핸들링(제어)할시에는 0 으로 초기화 되는 경우가 생깁니다.
그럴때 임시방편으로 flock($fp, LOCK_EX) or die("Error! cant lock!"); 이런식으로 파일에 락을 걸어도 되지만
이또한 초기화가 된다고 합니다.

중,대규모 사이트에서 카운터를 이용하려면 데이터베이스를 이용하는게 좋습니다.

데이터베이스의 경우 동시처리,검색,여러제어기능등을 지원하기 때문에 편하고 더 안전합니다.