로그분석기를 필요로 하는 경우는 대체적으로, 웹사이트를 운영하고 있거나 웹서비스를 제공하고 있는 분들에 한정될 확률이 높을 것으로 생각하고 있지만, 개인도메인에 기반한 블로그를 운영하는 사용자 입장에서도 단순 "방문카운트" 가 아닌, 보다 다양한 정보에 기반할 수 있는 로그분석기를 선호할 것은 의심할 여지가 없을 것입니다.

다만, 시중에 널리 퍼져 있는 대다수의 상용 로그분석기는 매월 일정액의 "사용료" 를 지불해야 하는 부담이 존재함과 더불어, 무료로 사용할 수 있는 로그분석기의 대표주자인 구글 웹마스터 도구(링크) 와 다음 웹인사이드(링크)는 개략적이면서도 합축적인 정보는 파악할 수 있을 지언정, 개별 트래픽의 분석이 불가능하다는 불편함을 갖고 있는 한편, 오래전부터 일부의 사용자들이 사용해왔던 N@LOG(링크)는 지원하는 분석툴이 다소 부족한 탓으로 인해, 실상 대부분의 사용자(특히 기업)는 상용 로그분석기를 이용하게 마련이었습니다.

그러나 해외에서는 오래전부터 로그분석기와 관련한 오픈소스 프로젝트가 진행되어 왔으며, GNU 개발자들의 노력을 통해 누구나 쉽게 무료로 사용할 수 있는 설치형 로그분석기를 내놓은지가 한참이나 오래전이었지만, 국내에서는 그 인지도가 매우 부족하여 오늘 이 자리에 소개하고자 하니.. 이 것이 바로 Open source web analytics인 Piwik 입니다.




Piwik(http://piwik.org/)은 PHP와 Mysql 에 기반하여 작동되는 오픈소스로서, Joomla, Drupal 까지 지원하는 다양한 플러그인(링크) 들을 바탕으로 전세계에서 가장 많이 쓰여지고 있는 로그분석기임은 물론, 웹서비스와의 연동 가능성을 한층 높이기 위한 오픈API 툴을 동시에 제공하는 꽤나 매력적인 무료 도구라고 할 수 있습니다.

사실상, Piwik은 구글 웹마스터 도구의 "기본엔진" 이기도 하기 때문에, 구글 웹마스터 도구의 대쉬보드에서 확인할 수 있는 다양한 경로의 "트래픽분석" 을 동일하게 사용할 수 있음은 물론, 구글에서 제공하지 않는 "개별 트래픽에 대한 정보" 들까지 하나하나 다룰 수 있음과 더불어, cpc광고에 대한 효과라던가, 특정 파일의 다운로드 횟수 및 경로 등을 파악한다던가, 각각의 유입경로에 따른 성과전환 확률을 개별적으로 판단할 수 있는 "목표전환설정" 캠페인을 설정할 수도 있기 때문에, 여타의 상용 로그분석기와 비교해도 손색이 없는 물건인 셈입니다.

Piwik의 로그분석기 데모페이지 확인링크

위 데모페이지를 통해 Piwik이 제공하는 로그분석기로서의 기능들을 확인하실 수 있는데, 안타까운 것은 "한국어" 에 대한 언어팩을 따로 제공하고 있지 않기 때문에 키워드 분석에 대한 부분은 다소 예상치 못한 오류가 발생할 수도 있다는 점입니다.

이 점은, 특히 UTF-8 기반의 웹사이트, 웹서버에서는 발견할 가능성이 적은 문제이나, EUC-KR 기반의 웹사이트, 웹서버에서는 한글깨짐현상을 비롯, 다양한 문제가 야기될 수 있으므로, Piwik을 전용 로그분석기로 사용하고자 하시는 경우에는 반드시 서버의 언어셋을 UTF-8 로 맞추어 놓으실 것은 권장하는 바입니다.



※ Piwik을 돌리기 위한 최소 필요사항은 아래와 같습니다.
- php 5.1.3 이상, mysql 4.1 이상
- php PDO 모듈 활성화, 독립된 서버(호스팅서버 포함)

※ Piwik의 인스톨 절차는 아래와 같습니다.
1. Piwik을 다운받은 후, FTP등을 통해 서버에 업로드합니다 (Piwik 0.4.3 버전의 다운로드)
2. 웹브라우저로 업로드한 디렉토리의 index.php 를 연결합니다.
3. 화면에서 지시하는 절차를 따릅니다. (mysql 설정 등)
4. 주어진 자바스크립트를 본인의 웹사이트 html 페이지 내에 집어 넣습니다. (끝)

※ Piwik의 오픈API는 XML형태와 JSON형태로 제공됩니다.
- 자세한 정보는 http://dev.piwik.org/trac/wiki/API/Reference 참조


Piwik은 기본적으로 GPL에 준한 오픈소스이기 때문에, 만약 한국의 사용자가 본 오픈소스를 통해 한글 로컬라이징을 실시, 재배포를 한다해도 전혀 문제의 여지가 없습니다. (라이센스는 명시해야 겟지만, Piwik 이라는 로고를 사용하지 않아도 됩니다.)

아무튼, 모쪼록 보다 자세한 로그정보들을 무료로 분석할 수 있는 최고의 툴을 찾는다면, Piwik 을 선택하는 것 하나만으로도 많은 짐을 덜게 되리라 생각합니다.
Posted by 동원삼치
대개 PHP로 게시판을 만든다거나, 최근게시물을 뽑아온다거나 하는 등의 작업을 할 때면
정해놓은 가로크기(wIdth) 보다 글자수가 많은 경우 이를 잘라주어야 하는 경우를 만날 때가 많습니다.

여기서 보편적으로 사용하는 몇가지 명령으로는

1. strlen  - 글자수를 계산해서
2. substr - 정해놓은 값만큼 자르거나
3. mb_substr - UTF-8의 경우는 mb_명령을 붙여서 자른 후에
4. echo ".." - 쩜쩜과 같은 텍스트를 마지막에 붙여넣어라

하는 4단계의 작업을 거치고는 하죠.

이를 귀찮게 생각한 나머지 일부 PHP개발자들은 글자수를 원하는대로 자를수 있는 갖가지의
Function 을 만들어서 사용해오곤 했으나.. PHP5 버전부터는 이러한 불편함을 한번에 해결해 줄수 있는
명령이 새로이 추가된 바 있으니.. 이 명령이 바로 mb_strimwidth 라 할 수 있겠습니다.

string mb_strimwidth ( string $str , int $start , int $width [, string $trimmarker [, string $encoding ]] )

위 구문이 php.net의 기본 구문이나. 이를 쉽게 풀어보면 아래와 같습니다.

mb_strimwidth('텍스트','시작위치','끝위치',"끝에붙일말","언어코드");

간략하게 기술해놓은 아래의 예제를 보시면 더욱 쉽게 이해하실 수 있습니다.

$text = '가나다라마바사';
$strim = mb_strimwidth($text, '0', '5', '...', 'utf-8');
echo $strim;

결과 = 가나다라마...

UTF-8로 정의된 $text의 값을 0번째 뒤부터 5번째 글자까지 자르고, 마지막에 ... 를 붙이는 일괄작업을 이 mb_strimwidth 명령 하나만으로 간편하게 지정할 수 있습니다.


$text = '가나다라마바사';
$strim = mb_strimwidth($text, '2', '6', '..', 'utf-8');
echo $strim;

결과 = 다라마바..

UTF-8로 정의된 $text의 값을 2번째 뒤부터 6번째 글자까지 자르고, 마지막에 .. 을 붙입니다.

대개 euc-kr로 정의된 문자는 한글 1자를 총 2개의 글자수를 가진 것으로 인식하기 때문에
보다 정확한 처리를 위해서라면 utf-8 로 변수값을 정의하는 것이 유리하다고 할 수 있습니다.

echo strlen("가나다"); => 6
echo mb_strlen("가나다"); => 3

따라서 PHP5 버전 이상의 환경이 구축된 서버를 이용하여 한글 자르기와 관련한 작업을 한다면
UTF-8을 기본언어셋으로 설정하여 mb_strimwidth 명령을 통해 작업의 간편화를 도모하시는 것이
여러모로 유리하다고 할 수 있겠죠?
Posted by 동원삼치

PHP 속도최적화 (퍼온글)

 | PHP
2009/09/08 11:50
1. 최대한 쌍따옴표 대신에 일반따옴표를 쓴다.

쌍따옴표로 감산 문자열의 경우 PHP는 문자열 전체를 처리하게 됩니다.
따라서 처리되지 않고 그대로 유지될 혹은 나중에 처리되어야할 문자열의 경우 일반따옴표를 쓰는 것이 좋습니다.

예) $string = '문자열';

문자열 중간에 변수가 삽입될 경우에도 최대한 일반 따옴표를 쓰는 것이 좋지요.

예) $string = '문자열1' . $string2 . '문자열2';

참고로 성능튜닝은 아니고 코딩스타일인데, 쌍따옴표로 감싼 변수가 삽입된 문자열의 경우 변수는 { 와 }로 감싸주는 것이 좋습니다.
이 경우 객체변수나 배열변수 혹은 배열+객체변수도 삽입 가능합니다.

예) $string = "문자열1 {$string2} 문자열2 {$object->var} 문자열3 {$array[0]} {$array[1]->var}";

주의할 점)
아시겠지만 문자열에 일반따옴표가 들어갈 경우 따옴표마다 앞에 역슬래쉬로 escape시켜줘야 하는 점입니다.
쌍따옴표는 그대로 표현하면 됩니다.
이런 문자열변수를 eval로 처리할 경우에는 미리 str_replace() 함수로 쌍따옴표 앞에 역슬래쉬를 붙여주는 작업이 필요하게 됩니다.
이러한 점만 숙지한다면 큰 문제는 없을 것입니다.



 2. 루프문에서 함수 사용은 금물

for ($i=0; $i<count($array); $i++) {

위와 같은 for 루프문들이 쓰이는 것을 곧잘 볼 수 있습니다.
PHP의 for 루프문, 두번째 인자의 함수는 매 루프마다 불려지기 때문에
배열이 클수록 함수를 부르는데 걸리는 시간만으로도 실행 시간을 상당히 뺏기게 됩니다.
이는 다음과 같이 바꿔주는 것이 좋습니다.

예1) for ($i=0, $cnt=count($array); $i<$cnt; $i++) {

예2)
$cnt = count($array);
for ($i=0; $i<$cnt; $i++) {

이 방법만으로도 엄청난 성능 개선을 가져왔다는 예도 있습니다. 배열이 무척 컸나보네요^^;
추가: 실제로 저의 경우에도, 엄청나지는 않았지만 꽤 괜찮은 성능개선을 맛봤었답니다 :)



 3. 버퍼링

기본적으로 PHP의 버퍼 크기가 8K이기때문에 결과물이 크면 나누어서 보내야 하기에 I/O 시간만으로도 상당한 시간을 잡아먹게 됩니다.
하지만 버퍼링으로 결과물을 모았다가 한꺼번에 뿌려주게 되면 다른 방법들을 쓰지 않더라도 몇배의 성능 개선도 가져올 수 있습니다.

간단히 스크립 처음에 마지막에 각각 ob_start() 와 ob_end_flush() 를 추가해주기만 하면 됩니다.

그냥 ob_start() 대신 ob_start('ob_gzhandler') 로 추가할 경우 (PHP에 gzip 모듈이 올라와 있어야 합니다.)
대부분의 웹브라우져가 압축을 지원하므로 트래픽양을 줄일 수 있고 결과적으로 클라이언트의 화면에 페이지가 뜨는데 걸리는 시간이 단축됩니다.
이 방법을 쓰더라도 웹브라우져가 압축을 지원하지 않으면 압축을 하지 않고 보내므로 따로 압축을 지원하는지 안하는지 확인할 필요도 없습니다.



 4. 옵코드 캐싱

PHP의 젠드엔진은 PHP코드를 자체적인 옵코드로 컴파일한 후 실행을 합니다.
이 부분에서도 로드가 높은 사이트에서는 상당한 오버헤드가 일어날 수 있습니다.
따라서 PHP코드를 새로 컴파일해서 실행하는 것보다는 기존에 컴파일된 옵코드를 바로 실행하면 많은 실행속도를 단축시킬 수 있습니다.
이는 옵코드 캐시 모듈을 적재해야 하기 때문에 모든 곳에서 적용하기는 힘들 것입니다.
하지만 제가 알기론 대부분의 호스팅회사에서는 젠드옵티마이저를 적재하기 때문에 따로 신경쓰지 않으셔도 될것입니다.
만약 서버관리권한이 있거나 한다면 다른 옵코드 캐싱 모듈을 써보실 것도 권해드립니다.
APC(Advanced PHP Cache), Eaccelerator 혹은 현재는 개발 중단된 Turk-MMCache 등이 있는데, APC는 PECL로 설치가 가능하며 상당히 좋습니다.
Eaccelerator가 성능은 좀더 낫다는 것 같지만요. 이는 직접 테스트 비교해보는 것이 좋을 것입니다.
주의할 점은 젠드옵티마이저를 사용하지 않으면 젠드컴파일러로 컴파일된 바이너리는 실행하지 못한다는 단점이 있습니다.
컴파일된 상용 php프로그램 사용시에는 다른 방법이 없습니다..^^;;; 

 

 5. Regular Expression : POSIX Extented(ereg_) VS. Perl-Compatible(preg_)

대부분의 속도비교결과 Perl-Compatible 정규표현식이 조금 더 빠르다고 합니다. perl호환 정규표현식을 사용하기를 권장합니다.



 6. 정규표현식 VS. str_replace()

간단한 문자 치환의 경우에는 str_replace() 함수를 쓰는 것이 훨씬 빠릅니다.
복잡한 따라서 정규표현식을 꼭 써야하는 경우를 제외하고는 PHP 기본문자함수를 쓰는 것이 좋습니다.



 7. is_numeric(), is_integer()등 VS ctype_XXX()

변수의 형식을 체크할 시 기본 PHP함수보다 ctype이 더 빠르다고 합니다.
대신 ctype으로는 11가지 형식에대한 체크만 가능하다는 한계가 있으므로 자세한 것은 PHP매뉴얼을 참조하시길 바랍니다.
ctype은 PHP 매뉴얼에서 Character Type Functions 항목입니다.

출처 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=49020&sca=&sfl=wr_subject%7C%7Cwr_content&stx=%C4%B3%BD%C3&sop=and


솔직히 한 5년 PHP 만지작거리면서 솔직히 속도 최적화에 대해 확실하게 덕을 봤다고 생각하는건..
쌍따옴표 -> 홀따옴표 이거 하나인듯;;

Posted by 동원삼치

BLOG main image
by 동원삼치

카테고리

전체 (15)
HTML (1)
JQUERY (7)
PHP (3)
APACHE (3)
JAVASCRIPT (1)

글 보관함