주간 베스트 월간 베스트 3개월 베스트 베스트 게시물
연길시 신화서점 조선말 도서

자신만의 카운터를 가져보자 - 정말끝

광수 | 2001.10.17 00:35:19 댓글: 0 조회: 711 추천: 14
분류웹 프로그래밍 https://life.moyiza.kr/itstudy/1758816
▶ 자신만의 카운터를 가져보자 - 정말끝

이번 회가 정말 파일 카운터의 마지막입니다. ^^; 전 강의까지 파일을 이용한 실제
곧바로 사용될 수 있는 카운터를 제작해보았습니다.

counter.php 파일이 그것인데 그 프로그램은 파일에 내용을 기록하는 역할만 하기
때문에, 실제 화면에 수치를 출력하기 위한 하나의 프로그램이 더 필요합니다. 또한
현재 저장되는 데이터에 맞는 정말 간단한 통계를 보여주는 프로그램도 필요하구요.

오늘 머리를 긁적이며 미리 만들어두었습니다. 소스를 먼저 올려둡니다.


▷ 카운트 값을 읽자...

[read.php]
--------------------------------------------------------------------------------
<?
// 기본 설정
$절대경로   = "/public_html/count"; // counter.php 파일이 있는 절대 경로 지정
$데이터파일 = $절대경로."/counter.cgi"; // 카운터 기록된 파일
$파일핸들 = fopen($데이터파일,"r");         // 읽기 모드로 오픈
// 전체
fseek($파일핸들,0);                         // 해당 위치로 이동 (방문자)
$count[total_visit]  = fread($파일핸들,10); // 10 바이트 읽어옴
fseek($파일핸들,351);                       // 해당 위치로 이동 (페이지뷰)
$count[total_page]   = fread($파일핸들,10); // 10 바이트 읽어옴
// 오늘
fseek($파일핸들,10);                        // 해당 위치로 이동 (방문자)
$count[today_visit]  = fread($파일핸들,10); // 10 바이트 읽어옴
fseek($파일핸들,361);                       // 해당 위치로 이동 (페이지뷰)
$count[today_page]   = fread($파일핸들,10); // 10 바이트 읽어옴
// 어제
fseek($파일핸들,20);                        // 해당 위치로 이동 (방문자)
$count[yester_visit] = fread($파일핸들,10); // 10 바이트 읽어옴
fseek($파일핸들,371);                       // 해당 위치로 이동 (페이지뷰)
$count[yester_page]  = fread($파일핸들,10); // 10 바이트 읽어옴
// 최고
fseek($파일핸들,30);                        // 해당 위치로 이동 (방문자)
$count[max_visit]    = fread($파일핸들,10); // 10 바이트 읽어옴
fseek($파일핸들,381);                       // 해당 위치로 이동 (페이지뷰)
$count[max_page]     = fread($파일핸들,10); // 10 바이트 읽어옴
fclose($파일핸들);                          // 파일 닫기
?>
--------------------------------------------------------------------------------

이 read.php 프로그램은 기존에 저장된 파일로부터 전체, 오늘, 어제, 최고 방문자와
페이지뷰값을 읽어들입니다. fseek(), fread() 함수는 이미 많이 다루었죠? 열어둔
파일 내에서 특정 위치로 이동(fseek)해 일정 값을 읽는(fread) 명령들이죠~ ^^;

그래도 잠깐 짚고 넘어가자면 fseek() 함수에 쓰인 주소값입니다. 0,10,20,30 그리고
351,361,371,381은 어떤 값일까요? 괜히 머리굴리며 고민할 필요 없습니다. 바로
위에서 썼으니까요. 파일 내의 특정 위치값입니다. 이 부분에 대해선 바로 전편에서
다뤘죠? [해당 카운터를 자신의 계정에 직접 설치한 다음 최초 실행을 하면
counter.cgi 파일이 생성됩니다. 이 파일을 열어보면 구조를 단번에 알아볼 수 있을
거에요.]


▷ 통계를 보자...

지금까지의 과정을 충실히 보고 실습을 해본 분이라면 아래의 프로그램을 이해하는데
어려움은 없을 것입니다. ^^; 파일의 내용을 그대로 읽어 각각의 값들을 변수에 나눠
저장하고, 이를 다시 테이블로 출력하는 형태니까요.

다만 처음 등장하는 함수에 대해서만 소개하면 되겠네요. ceil() 함수는 괄호안에
지정한 값을 올림해 반환해줍니다. 즉 echo ceil(4.5);란 명령을 내리면 올림값 즉
5란 값을 출력하게 됩니다. 4.0은 4로, 4.1 이상의 값들은 모두 5로 출력하게 되죠.

또한 max() 함수는 지정한 값들로부터 제일 큰 값을 구합니다. echo max(1,2,6,4);란
명령을 수행했을 경우 제일 큰 값 6이 출력되죠.

아래 통계 프로그램에서 각 파트별 (기본,시간별,요일별) 제일 큰 값을 기준으로 하여
그래프의 길이를 구했습니다. 100명중 20명이 출석했을 경우 퍼센트는 20/100 * 100
이렇게 구하죠? 그것과 마찬가지에요. [특정값/최고치*최고길이]

나머지는 차근차근 보시면 될거에요.

[status.php]
--------------------------------------------------------------------------------
<html>

<head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title>심플 통계</title>
<style>
<!--
p  { font-family:굴림체;      font-size:9pt; }
td { font-family:Small Fonts; font-size:7pt; }
-->
</style>
</head>
<body bgcolor="white" text="black" leftmargin="0" marginwidth="0" topmargin="0" marginheight="0">
<?

// 기본 설정
$절대경로   = "/public_html/count"; // counter.php 파일이 있는 절대 경로 지정
$이미지경로 = "http://dreamphp.com/count"; // 카운터가 설치된 URL

// 파일명
$데이터파일 = $절대경로."/counter.cgi";         // 카운터 기록된 파일
$파랑       = $이미지경로."/blue.gif border=0"; // 파랑 이미지 파일의 URL
$빨강       = $이미지경로."/red.gif border=0";  // 빨강 이미지 파일의 URL

// 항목명 설정
$기본[항목] = array("전체","오늘","어제","최고");
$시간[항목] = array("00 시","01 시","02 시","03 시","04 시","05 시","06 시","07 시","08 시","09 시","10 시","11 시",
                    "12 시","13 시","14 시","15 시","16 시","17 시","18 시","19 시","20 시","21 시","22 시","23 시");
$요일[항목] = array("일요일","월요일","화요일","수요일","목요일","금요일","토요일");

// 기록되어 있는 카운트 값 읽어옴
$파일핸들 = fopen($데이터파일,"r"); // 읽기 모드로 오픈
for ($i=0; $i<35; $i++) { // 0부터 34까지 반복 (기본 4 + 시간별 24 + 요일별 7)
  fseek($파일핸들,$i*10); // 해당 위치로 이동
  $방문자   = fread($파일핸들,10); // 10 바이트 읽어옴
  fseek($파일핸들,$i*10+351); // 해당 위치에서 351 바이트 떨어진 곳(다음줄) 위치로 이동
  $페이지뷰 = fread($파일핸들,10); // 10 바이트 읽어옴
  if ($i<4)      { $기본[방문][] = $방문자; $기본[페이지][] = $페이지뷰; } // 전체,오늘,어제,최고 방문자와 페이지뷰값 저장
  elseif ($i<28) { $시간[방문][] = $방문자; $시간[페이지][] = $페이지뷰; } // 시간대별 방문자와 페이지뷰값 저장
  else           { $요일[방문][] = $방문자; $요일[페이지][] = $페이지뷰; } // 요일별 방문자와 페이지뷰값 저장
}
fclose($파일핸들); // 파일 닫기

function 그래프 ($배열값) { // 사용자 정의 함수
  global $파랑, $빨강; // 전역 변수 사용
  echo "<table border=0 cellpadding=1 cellspacing=1>n"; // 테이블의 시작
  $갯수       = sizeof($배열값[항목]); // 배열의 크기 구함
  $방문최대   = max($배열값[방문]);    // 방문자 값 중 제일 큰 값 구함
  $페이지최대 = max($배열값[페이지]);  // 페이지뷰 값 중 제일 큰 값 구함
  for ($i=0; $i<$갯수; $i++) { // 배열의 크기만큼 반복
    $방문길이   = ceil($배열값[방문][$i]/$방문최대*184); // 그래프의 길이 계산
    $페이지길이 = ceil($배열값[페이지][$i]/$페이지최대*184); // 그래프의 길이 계산
    echo "  <tr>n    <td width=52 align=right bgcolor=#CCCCCC><p>{$배열값[항목][$i]} </p></td>
    <td width=236 bgcolor=#EEEEEE><img src=$파랑 width=$방문길이 height=6> ({$배열값[방문][$i]})<br>
<img src=$빨강 width=$페이지길이 height=6> ({$배열값[페이지][$i]})</td>n  </tr>n";
  }
  echo "</table>n"; // 테이블의 끝
}

echo "<table border=0 cellpadding=1 cellspacing=0>
  <tr>
    <td valign=top>
<b>※ 기본</b>n";
그래프($기본); // 함수 호출

echo "<br>
<b>※ 요일별</b>n";

그래프($요일); // 함수 호출

echo "<br>

<p><b>※ Info.</b><br>
<img src=$파랑 height=6 width=100> [방문자]<br>
<img src=$빨강 height=6 width=100> [페이지뷰]
</p>
</td>
    <td valign=top>
<b>시간별</b>n";

그래프($시간); // 함수 호출

echo "</td>
  </tr>
</table>n";

?>
</body>
</html>
--------------------------------------------------------------------------------


▷ 카운터를 설치하자...

순서를 자세히 적었기 때문에 다소 길어보이지만, 한번 이 과정이 익숙해지면 앞으로
어떠한 PHP 프로그램이건 설치에 있어선 눈 딱 감고 할 수 있게 될 것입니다.
[과장이 지나쳤나요? ^_^] 한단계 한단계 직접 실습을 통해 익혀보세요.

1. 프로그램을 다운받는다.

2. PHP를 지원하는 계정의 홈 디렉토리에 counter 라는 하위 디렉토리를 생성한다.
   public_html 디렉토리가 홈 디렉토리죠. ^^; 결국 public_html/counter가 됩니다.

3. counter 디렉토리의 권한을 777로 변경한다.

4. path.php 파일을 올린다.

5. 웹브라우저를 열어 http://홈주소/counter/path.php로 접근한다.

6. counter.php, read.php, status.php 총 3개 파일을 열어 5에서 출력결과로 얻어진
  경로명으로 수정한다.
  (status.php의 경우 $이미지경로 = "http://홈주소/counter";로 수정해준다.)

7. 카운터를 설치할 문서에 카운터를 include 시킨다.
  <? include "./counter/counter.php"; ?>
  프레임으로 나눈 경우 프레임셋 파일(주가 되는 파일)의 상단에 추가하면 됩니다.
  여기서 잠깐! .은 현재 위치를 말합니다. public_html 디렉토리에 있는 문서일
  경우 이처럼 현재 위치로부터(.) counter 디렉토리에 있는 어떤 파일을 include
  해라!란 명령이 위와 같은 것이죠.

8. 방문자나 페이지뷰 수치를 출력하고 싶으면 read.php 파일을 include 시킨다.
  <? include "./counter/read.php"; ?>
  그 다음 문서 내에 출력하고자 하는 항목의 코드를 삽입한다.
   전체방문 : <?=$count[total_visit]?>,  전체페이지뷰 : <?=$count[total_page]?>
   오늘방문 : <?=$count[today_visit]?>,  오늘페이지뷰 : <?=$count[today_page]?>
   어제방문 : <?=$count[yester_visit]?>, 어제페이지뷰 : <?=$count[yester_page]?>
   최고방문 : <?=$count[max_visit]?>,    최고페이지뷰 : <?=$count[max_page]?>

9. 통계를 보려면 다음 문장을 원하는 위치에 삽입한다. 적절히 변경하세요. (한줄임)
   <a href=javascript:void(window.open('http://홈주소/counter/status.php','status','width=300,height=500,resizable=no,scrollbars=yes,toolbars=no')) onfocus=blur()>통계</a>

말이 길었지만 실제 한 페이지에 나타내보면 다음과 같습니다.

[index.html]
--------------------------------------------------------------------------------
<? include "counter.php"; ?>
<html>
<head>
<title>::: BiHon's DreamPHP.com :::</title>
<style>
body { font-family:굴림체; font-size:9pt; }
</style>
</head>
<body bgcolor=white text=black>
<br>
<hr>
<br>
안녕하세요! 본 문서는 예제를 위해 날림 제작된 문서입니다. ^^;<br>
<br>
<br>
<p align=center><? include "read.php"; ?>
오늘방문 : <?=$count[today_visit]?> / 전체방문 : <?=$count[total_visit]?><br>
오늘페이지뷰 : <?=$count[today_page]?> / 전체페이지뷰 : <?=$count[total_page]?><br>
<a href=javascript:void(window.open('status.php','status','width=300,height=500,resizable=no,scrollbars=yes,toolbars=no')) onfocus=blur()>통계</a>
<br>
<hr>
그럼 즐거운 하루하루 되세요~
</body>
</html>
--------------------------------------------------------------------------------

include란 명령 뒤에 해당 파일을 직접 지정한 이유는 index.html 파일과 해당
파일들이 같은 디렉토리 내에 있기 때문입니다. 만약 다른 경로에 있다면 설치 순서에
나와있든 경로를 설정해주어야합니다. 통계에서도 마찬가지로 http://를 생략한
것입니다.

프레임으로 문서를 나눈 경우는 프레임셋 파일(HTML에 대한 기본 지식이 없는 분은
먼저 HTML 관련 사이트의 내용을 찾아보도록 하세요.)에는 counter.php 파일만
include 시키고, 카운트를 출력할 문서에는 read.php 파일만 include 하고 출력할
값을 지정해주면 됩니다. [나중에 편리함을 느낄 수 있을거에요.]


▶ 정말로 카운터 프로그램에 대해 마치도록 하겠습니다. 이해가 안되는 부분이
있다면 PHP 입문 편과 카운터 기초 1,2,3편을 다시 한번 살펴보도록 하세요. 이번
카운터에 대해 실습을 통해 (제작 및 설치) 이해하신 분은 다음 강의부터는 편하게
볼 수 있을 것입니다. ^-^


▷ 프로그램 : http://dreamphp.com/study2/count4-2/count4-3.zip

▷ 미리보기 : http://dreamphp.com/study2/count4-2 (index.html 생략)
▷ 소스보기 : http://dreamphp.com/study2/count4-2/index.phps

▷ 미리보기 : http://dreamphp.com/study2/count4-2/read.php
▷ 소스보기 : http://dreamphp.com/study2/count4-2/read.phps

▷ 미리보기 : http://dreamphp.com/study2/count4-2/status.php
▷ 소스보기 : http://dreamphp.com/study2/count4-2/status.phps

ps 다음 회부터 메모장에 대한 강의에 들어가도록 하겠습니다.

★ 실수한 부분이 있었습니다. 오늘 날짜의 파일을 생성하게 될 경우 기존의 오늘
값을 어제 값 위치로 옮겨야 하는데 이 과정이 누락되었습니다. 이번 압축 파일에
포함되어 있으니 꼭 참고하도록 하세요.

* 전설님에 의해서 게시물 이동되었습니다 (2004-05-30 17:07)
* 이동한 이유 :
* 원래의 위치 : 웹 공부 >> 웹 프로그래밍
* 이동후 위치 : 웹 공부 >>

* 전설님에 의해서 게시물 이동되었습니다 (2004-05-30 17:12)
* 이동한 이유 :
* 원래의 위치 : 웹 공부 >>
* 이동후 위치 : 웹 공부 >> 웹 프로그래밍
추천 (14) 선물 (0명)
IP: ♡.149.♡.65
3,006 개의 글이 있습니다.
제목 글쓴이 날짜 조회
관리자
2003-09-20
11945
관리자
2003-09-20
11495
관리자
2003-09-20
20629
지구인
2010-08-27
19420
지구인
2009-09-07
13740
SOLIDH
2010-01-29
15697
엔죠라이프
2004-10-07
16790
광수
2001-10-17
425
광수
2001-10-17
577
광수
2001-10-17
720
광수
2001-10-17
372
광수
2001-10-17
447
광수
2001-10-17
711
광수
2001-10-17
591
광수
2001-10-17
565
광수
2001-10-17
598
광수
2001-10-17
503
광수
2001-10-17
623
광수
2001-10-17
832
광수
2001-10-17
792
광수
2001-10-17
629
광수
2001-10-17
788
광수
2001-10-17
451
광수
2001-10-17
510
광수
2001-10-17
446
광수
2001-10-17
657
광수
2001-10-17
509
광수
2001-10-17
733
모이자 모바일