2018년 5월 21일 월요일

[PHP예제] 111 파일을 사용해 액세스 카운터를 작성


create_access_counter.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
// 페이지 ID를 설정함
// 페이지 ID마다 카운터 파일을 만듦
// 이 파일에 직접 액세스한 경우는 '0'으로 기록함
$pageID = !isset($pageID) ? 0 : $pageID;

// 허용하는 페이지 ID만 카운트 함
// 허용하는 페이지 ID의 배열(직접 액세스를 거부할 경우 배열에서 '0' 삭제)
$countPages = array(0, '1', '2', 'top', 'home');

// in_array() 함수의 제3인수에 true를 설정하고 유형도 확인함
if( !in_array($pageID, $countPages, true) )
{
  echo "카운트할 수 없음";
  return;
}

// 경로를 포함한 카운터 값을 기록할 파일을 설정함
$counterPath = __DIR__;
if( !is_dir($counterPath) )
{
  die('디렉터리가 존재하지 않음');
}
$counterFile = realpath($counterPath) . '/' . $pageID . '.dat';

// 파일을 연다(추가 기록/읽기 모드)
$fp = fopen($counterFile, 'a+b');
if( !is_resource($fp) )
{
  die('파일을 열지 못했음');
}

// 파일을 잠금
flock($fp, LOCK_EX);

// 카운터 값을 가져오고 1을 가산함
$count = fgets($fp);
$count = $count + 1;

// 파일의 내용을 지움
ftruncate($fp, $count);

// 파일에 카운터 값을 기록함
fwrite($fp, $count);

// 파일의 잠금을 해제함
fflush($fp);
flock($fp, LOCK_UN);

// 파일을 닫음
fclose($fp);

// 카운터 값을 출력
echo "액세스 수: $count (PAGE ID:$pageID)";

111.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>파일을 사용해 액세스 카운터를 작성</title>
    <link href="style.css" rel="stylesheet">
</head>
<body>
<div>
<?php
// 카운터 처리용 파일을 읽음
$pageID = 'home';
include './create_access_counter.php';
?>
</div>
</body>
</html>


댓글 없음:

댓글 쓰기