일일 통계 생성을 위한 테이블 구조 및 테이블에 데이터를 저장하기 위한 코드를 작성했다.
가장 간단하게 userID 별 접속횟수, 날짜별 접속횟수만 기록되게 구현했다.
테이블 구조
CREATE TABLE IF NOT EXISTS Access_Stats (
uid int(11) NOT NULL AUTO_INCREMENT,
date char(8) NOT NULL,
YM char(6) NOT NULL,
day char(2) NOT NULL,
IDCnt int(11) NOT NULL DEFAULT '0',
dailyCnt int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (uid),
KEY date (date)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
=== 일일단위 통계 생성을 위한 코드 ===
<?php
require_once "dbconnect.php";
require_once "phpclass/statsClass.php";
$a=new statsClass();
// 일일 통계 기록
date_default_timezone_set('Asia/Seoul');
$date = date("Ymd", mktime(0,0,0,date("m"), date("d")-1, date("Y"))); // 어제
$YM = substr($date,0,6);
$day = substr($date,6,2);
if($a->Access_Stats($date) == '0'){ // 해당 날짜에 기록된 정보가 없으면
$sql = "INSERT INTO Access_Stats (date,YM,day,IDCnt,dailyCnt) (select ".$date.",".$YM.",".$day.",count(distinct LogID),sum(hit) from AccessLog where date='".$date."')";
@mysql_query($sql);
} else {
$row = $a->AccessLogCnt($date); // 배열로 가져옴
$sql = "Update Access_Stats SET IDCnt='".$row[0]."',dailyCnt='".$row[1]."' where date='".$date."'";
@mysql_query($sql);
}
echo "Work done";
exit;
?>
=== statsClass.php ===
<?php
class statsClass {
function Access_Stats($date){
global $db;
$sql ="select count(date) from Access_Stats where date='".$date."'"; // 기록된 데이터 있는지 조회
$result=mysql_query($sql);
if($row=mysql_fetch_row($result)){
return $row[0];
}
}
function AccessLogCnt($date){
global $db;
$sql ="select count(distinct userID),sum(hit) from AccessLog where date='".$date."'";
$result=mysql_query($sql);
if($row=mysql_fetch_row($result)){
return $row; // 배열을 반환
}
}
}
?>
매일 일정한 시간에 테이블에 데이터를 자동으로 저장하기 위해서는 crontab 을 이용해야 한다.
crontab 을 이용하기 위한 코드는 아래와 같이 하면 된다.
=== accessLog.php ===
!#/usr/local/php/bin/php -q
<?php
// cron 방식 DB 접속
require_once "/usr/local/apache/htdocs/dbconnect.php";
require_once "/usr/local/apache/htdocs/phpclass/statsClass.php";
$a=new statsClass();
// 일일 통계 기록
date_default_timezone_set('Asia/Seoul');
$date = date("Ymd", mktime(0,0,0,date("m"), date("d")-1, date("Y"))); // 어제
$YM = substr($date,0,6);
$day = substr($date,6,2);
if($a->Access_Stats($date) == '0'){
$sql = "INSERT INTO Access_Stats (date,YM,day,IDCnt,dailyCnt) (select ".$date.",".$YM.",".$day.",count(distinct LogID),sum(hit) from AccessLog where date='".$date."')";
@mysql_query($sql);
} else {
$row = $a->AccessLogCnt($date);
$sql = "Update Access_Stats SET IDCnt='".$row[0]."',dailyCnt='".$row[1]."' where date='".$date."'";
@mysql_query($sql);
}
echo "Work done";
exit;
?>
=== crontab 파일내에 코드 추가 ===
crontab 사용법은 http://link2me.tistory.com/990 참조
PHP 와 crontab 에 대한 사항을 좀 더 알고 싶다면 http://link2me.tistory.com/1013 참조
먼저 php 가 설치된 경로를 찾아야 한다.
// PHP 경로 찾기
whereis php
crontab 에 추가할 내용
// 매일 2시 0분에 실행
0 2 * * * /usr/local/php/bin/php /usr/local/apache/htdocs/stats/accessLog.php
// 매 5분마다 실행 ==> 실제 제대로 저장되는지 여부를 테스트
*/5 * * * * /usr/local/php/bin/php /usr/local/apache/htdocs/stats/accessLog.php
'Web 프로그램 > PHP 응용 및 활용' 카테고리의 다른 글
[PHP] 통계데이터 생성을 위한 시험 코드 (0) | 2016.12.30 |
---|---|
PHP strcmp(string1,string2) (느슨한 비교가 부르는 참사) (1) | 2016.12.19 |
접속자 통계 구하기 (0) | 2016.10.24 |
접속 허용 IP 체크 (0) | 2016.05.04 |
문자열 숫자 표기 (0) | 2016.04.23 |