사이트 내 전체검색
PHP
[php] using PHP Accelerator
로빈아빠
https://cmd.kr/php/483 URL이 복사되었습니다.

본문

using PHP Accelerator

- 작성자 : san2(at)linuxchannel.net
- 작성일 : 2002.10.16 (PHPA 1.3.3r1 내용 포함)
          2002.08.06 (내용 보완)
          2002.08.02 (오타 수정)
          2002.07.31

*주1)
이 문서는 Nick Lindridge 씨가 개발한 ionCube PHP Accelerator에 관한
설치와 설정에 관한 내용입니다. 또한 한글 문서가 거의 없어서
(그리 어렵지 않기 때문에)초보자나 처음 사용하시는 분을 위해서
작성되었습니다.

*주2)
Zend optimizer와 같이 사용할 수 없습니다.
만약 Zend optimizer를 설정해 놓았다면 반드시 off해 놓아야 합니다.

*주3)
이 문서에 대한 최신 내용은 아래 URL에서 확인할 수 있습니다.

  http://www.linuxchannel.net/docs/php_accelerator.txt

*주4)
문맥상 간혹 경어를 생략했습니다. 양해해주시길 바랍니다.

[COLOR="Navy"]=============================================================

목차
0. 개요(빠른 설치)
1. PHP Accelerator?
2. PHP Accelerator 설치와 설정
  2.1 PHP Accelerator 다운로드
  2.2 PHP Accelerator 설치
  2.3 PHP Accelerator 설정
3. 작동확인
4. 간단한 속도 테스트
5. 관리자용 유틸리티 PHPACA
6. 기타 정보
7. 후기

=============================================================[/COLOR]

0. 개요(빠른 설치)

  1) 다운로드
    http://www.php-accelerator.co.uk/download.php
    파일이름 형식:
    php_accelerator-<버전>_<php버전>_<운영체제>.tgz
    php_accelerator-<버전>_<php버전>_<linux-glibc버전>.tgz(리눅스 경우)
  2) 압축해제 및 복사
# cp php_accelerator_1.3.2.so /usr/local/lib # cp phpa_cache_admin /usr/local/bin
  3) 설정(1.3.2부터 key 등록필요 없음)
# phpini='/usr/local/lib/php.ini' # echo >> $phpini # echo "zend_extension = /usr/local/lib/php_accelerator_1.3.2.so" >> $phpini # cat CONFIGURATION | egrep "^(phpa[^=]+=|;)" \ | grep -v "phpa\.phpa" >> $phpini
  4) 아파치 재시작
# apachectl restart
  5) 확인
     phpinfo();




1. PHP Accelerator?

ionCube PHP Accelerator(이하 'PHPA')는 Zend Accelerator(Zend cache)와 같이
PHP 캐시 역할을 제공하는 'Zend engine extension' 중의 하나로써
Nick Lindridge(영국 분인듯) 씨가 개발했습니다.

PHPA는 PHP 스크립트를 클라이언트 요청에 의해서 서버에서 한번
읽혀지면, 일정 시간동안 캐시 메모리에 저장되고, 그 이후 요청은
실제로 메모리에 있는 정보를 해석하므로 HDD에서 읽는 것보다 훨씬
빠르게 작동합니다.

필자는 예전에 PHPA를 붙여서 쇼핑몰을 프로그램한 적이 있었는데 상당히
만족할 만한 성능을 내더군요. 예를 들어, PHPA 없이 서버가 PHP
스크립트를 해석하는 시간이 0.5초 걸렸다면 PHPA를 사용할 경우는
0.08초 정도 걸리더군요. 물론 객관적인 속도 측정(기준)은 아니지만,
PHPA를 사용할 경우 그 전보다 상당히 낫은 성능을 낸다는 것을 지레
짐작할 수 있습니다.

Zend Accelerator를 사용해 보신 분이 있다면 어느 정도 성능을 내는지
짐작할 수 있을 것입니다.

  - http://www.php-accelerator.co.uk/performance.php

앞의 URL에서 그 성능을 비교해 보면 Zend Accelerator(Zend cache)에
거의 근접한 수치를 내고 있음을 알 수 있습니다.

설치는 그리 어렵지 않은 편입니다. 즉 PHP나 아파치를 컴파일하는 과정
중에서 설치하는 것이 아니라, 아파치-PHP가 설치된 상태에서
'zend extension'을 지정해 주면 그만입니다.

즉 PHPA 홈페이지에서 제공하는 파일은 바이너리 파일로써 아직 소스는
공개되지 않았기 때문에 컴파일할 필요는 없습니다.

'PHPA is free'

좀더 자세한 내용을 알고 있다면 다음의 PHPA 홈페이지를 방문 하세요.

  - http://www.php-accelerator.co.uk/


PHPA와 같이 PHP cache 기능이 있는 다른 프로그램은 다음과 같습니다.

  - PHP Accelerator (Nick Lindridge) (freeware)
  - Alternative PHP Cache (Community Connect) (freeware)
  - AfterBurner (Bware Technologies) (freeware)
  - Zend Accelerator (Zend) (commercial)
  - 기타(...)

참고로 이 문서는 다음의 문서를 기준으로 작성되었습니다.

  - http://www.php-accelerator.co.uk/releases/x.x.x/INSTALL
  - http://www.php-accelerator.co.uk/releases/x.x.x/CONFIGURATION
  - http://www.php-accelerator.co.uk/faq.php



2. PHP Accelerator 설치와 설정

2.1 PHP Accelerator 다운로드

다음의 싸이트에서 PHPA를 다운로드 합니다. 참고로 2002.08.03(GMT+9) 현재,
리눅스 버전은 1.3.2 버전까지 나왔으며, 리눅스 이 외에 BSDi, FreeBSD,
OpenBSD(Intel), Solaris(Intel), Solaris(Sparc), Tru64 Unix(4.0G, 5.0, 5.1)
등의 운영체제에서 사용할 수 있습니다.

  - http://www.php-accelerator.co.uk/download.php

파일이름 형식:

  - php_accelerator-<버전>_<php버전>_<운영체제>.tgz
  - php_accelerator-<버전>_<php버전>_<linux-glibc버전>.tgz(리눅스 경우)

리눅스의 경우, glibc(GNU libc) 버전 별로 파일이 다르므로 반드시
설치하려는 서버의 glibc 버전을 확인해야 합니다.
레드햇 6.x(glibc-2.3.1), 레드햇 7.0(glibc-2.2), 레드햇 7.2(glibc-2.2.4)
이며, 확실하게 확인하려면 다음과 같이 명령을 내려서 확인하도록 합니다.

# ldd --version ldd (GNU libc) 2.2.4 <-- 확인 사항 Copyright (C) 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Roland McGrath and Ulrich Drepper.

만약 가장 최근의 PHPA 버전이 1.3.2이고, linux glibc 버전이 2.2.4이고,
현재 서버에서 사용하는 PHP 버전이 4.2.2이면,

  'php_accelerator-1.3.2_php-4.2.2_linux-glibc2.2.4.tgz'

파일을 다운로드하면 됩니다.

<업데이트 : 2002.10.16>
1.3.3으로 버전으로 올라가면서 리눅스의 경우는 기존의 glibc-2.2, glibc-2.2.4
으로 분류되었던 PHPA 버전이 없어졌습니다. 모두 'glibc2'라는 이름으로 통합되어
있으며 실제로는 glibc-2.1.3 버전이지만, glic-2.2.x 버전에서도 잘 작동합니다.
</업데이트>


2.2 PHP Accelerator 설치

다운로드한 파일을 압축 해제하면 다음과 같은 파일을 볼 수 있습니다.

CONFIGURATION openbsd_notes phpapowby.gif INSTALL php_accelerator_1.3.2.so powered-by-phpa.gif bsdi_notes phpa_acc_by.gif release_notes freebsd_notes phpa_cache_admin solaris_notes

제일 중요한 파일은 'php_accelerator_1.3.2.so'이며,
CONFIGURATION 파일은 설정할 내용에 관한 내용을 담고 있으므로 반드시
읽어보아야 합니다. 그 외 INSTALL 파일은 설치에 관한 내용을 담고 있으며,
phpa_cache_admin 파일은 관리자용 유틸리티입니다.

설치 순서 :

  1. php_accelerator_1.3.2.so 파일을 적당한 위치에 복사 또는 옮겨놓는다.
  2. phpa_cache_admin 파일을 /usr/local/bin 디렉토리 정도에 복사한다.
  3. php.ini 파일을 열어서 설정한다.

설치 예(아주 간단함) :

# cp php_accelerator_1.3.2.so /usr/local/lib/ # ln -s php_accelerator_1.3.2.so php_accelerator.so (필요하다면) # cp phpa_cache_admin /usr/local/bin


2.3 PHP Accelerator 설정

'php_accelerator_<PHPA버전>.so' 파일을 적당한 위치에 복사했으면
php.ini 파일을 열어서 편집해야 합니다.

php.ini 파일이 '/usr/local/lib/php.ini'에 있다는 가정입니다.

일단 php.ini 파일에 zend_extension 항목을 추가해야 하는데 간단하게
다음과 같이 cat 명령을 사용해서 추가해도 상관없습니다

처음 설치할 경우 :

# phpini='/usr/local/lib/php.ini' <-- 길게 쓰기 귀찮아서... # # cat << EOF >> $phpini > > ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; > ;;; PHP_Accelerator Configuration ;;; > ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; > > zend_extension = /usr/local/lib/php_accelerator_1.3.2.so > > EOF #


처음 설치할 경우에는 php.ini 파일에 추가할 사항이 많기 때문에 다음과 같이
CONFIGURATION 파일을 이용해서 필요한 설정 내용을 일단 추가해 놓고
편집하는 것이 좋습니다.

처음 설치할 경우 :

  [방법1] 설명 주석 없이 단순하게 설정 내용만 추가할 경우
# cat CONFIGURATION | egrep "^phpa[^=]+=" \ | grep -v "phpa\.phpa" >> /usr/local/lib/php.ini

  [방법2] 설명 주석을 포함할 경우
# cat CONFIGURATION | egrep "^(phpa[^=]+=|;)" \ | grep -v "phpa\.phpa" >> /usr/local/lib/php.ini

  [방법3] 좀더 세련되게(?) - (쉘로 작성)
# sh phpa_config ----------------- phpa_config ------------------------ #!/bin/sh phpini='/usr/local/lib/php.ini' CONFIGURATION='/any/path/to/CONFIGURATION' phpa_body_config=`cat "$CONFIGURATION" 2>/dev/null \ | egrep "^(phpa[^=]+=|;)" | grep -v "phpa\.phpa"` ## backup php.ini cp -f $phpini $phpini.bak #cat << EOF >> $phpini # #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #;;; PHP_Accelerator Configuration ;;; #;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; # #zend_extension = /usr/local/lib/php_accelerator_1.3.2.so #EOF IFS=' ' ## string 'key' old PHPA version, but compatible ## echo >> $php.ini for line in $phpa_body_config ; do if [ X$(echo "$line" | grep "^phpa") != "X" ] ; then line=`echo "$line" | sed \ -e "s/^phpa\.ignore_/;phpa.ignore_/" \ -e "s/^phpa\.shm_ignore_/;phpa.shm_ignore_/"` echo -e ";\n$line\n" >> $phpini else echo "$line" >> $phpini fi done exit 0
----------------- cut ------------------------

그 외, 그냥 php.ini 파일에서 CONFIGURATION 파일을 불러와서 편집하면
그만입니다.

업그레이드하는 경우는 release_notes 파일을 읽어보고 추가된 설정 내용이나
변경된 점을 php.ini 파일에 적용해야 합니다.

참고로 1.3.2로 업그레이드 되면서,

  phpa.shm_lock_threshold0 = 10
  phpa.shm_lock_threshold1 = 10

<업데이트 : 2002.10.16>
PHPA 1.3.3에서는
phpa.enable_php_memory_bug_workaround = 0
지시자가 추가되었습니다. 이 지시자는 PHP를 컴파일할 때 --enable-memory-limit
옵션을 주어 컴파일했다면 위의 지시자에 '1'로 설정하도록 하세요.
</업데이트>

두 개의 설정 내용이 추가되었으며, 또한 'ionCube PHP Encoder'로 인코딩된
PHP 파일을 'ionCube decoder'를 이용하여 디코딩한 다음 PHPA를 사용할 수 있습니다.

  zend_extension = /usr/local/lib/php_decoder_1.0.2.so
  zend_extension = /usr/local/lib/php_accelerator_1.3.2.so

'ionCube decoder'에 관한 내용은 http://www.ioncube.com/를 방문해 보세요.
참고로 PHP Encoder는 1.4 버전부터 지원한다고 하네요..

무엇보다 1.3.2로 업그레이드 되면서 'activation keys' 설정이 없어졌습니다.
PHPA 1.2.0 이상 버전부터 1.3.1까지는 PHPA key를 설정해줘야 합니다. 이 키는
특별하게 어떤 '통제'의 의미를 갖는 것은 아니고, 개발자 Nick Lindridge 씨에
의하면 어느 어느 싸이트에서 PHPA를 사용하는지 알아보기 위해서 고안한 방법
이라고 하네요.

PHPA 1.1p1에서 1.2로 넘어오면서 key 설정 부분이 추가되어서 상당히 황당했는데,
저 외에 여러 사람들도 다 같은 생각인것 같더군요. 다행이 1.3.2부터는
사라졌지만..... 다음의 싸이트를 방문하면 1.2로 넘어오면서 이 키 때문에
개발자가 곤욕을 당하는(?) 내용을 볼 수 있습니다.

  - http://www.freelists.org/archives/phpa/01-2002/threads.html

그리고 마침내 1.3.2를 릴리즈되기전, 2002년 6월에 결정을 했군요(^.^)

  - http://www.freelists.org/archives/phpa/06-2002/msg00060.html


다음의 PHPA 설정 항목(지시자)은 다른 PHP 설정 지시자과 똑같은
형식으로 httpd.conf, .htaccess(예) 등의 설정 파일에 각각 설정할 수 있습니다.
즉 <Directory>나 <Location> 콘테이너 안에 설정할 수 있다는 의미입니다.

# php.ini, httpd.conf php_value phpa.tweaks <0|1> # php.ini, httpd.conf php_value phpa <0|1> # php.ini, httpd.conf, .htaccess php_value phpa.cache_dir <path> # php.ini, httpd.conf, .htaccess php_value phpa.shm_ttl <period> # php.ini, httpd.conf php_value phpa.ignore_files <list> # php.ini, httpd.conf php_value phpa.ignore_dirs <list> # php.ini, httpd.conf php_value phpa.shm_ignore_files <list> # php.ini, httpd.conf php_value phpa.shm_ignore_dirs <list>


예를 들어,

  ------ httpd.conf(예) --------------------------------------
<Location /site1> php_value phpa.cache_dir /tmp/site1_phpa_cache php_value phpa.shm_ttl 6h </Location> <Location /site2/xdir> php_value phpa 0 </Location> <VirtualHost xxx.xxx.xxx.xxx> ServerName www.linux.ac.kr php_value phpa 0 ... </VirtualHost> <VirtualHost xxx.xxx.xxx.xxx> ServerName www.otherhost.com php_value phpa.cache_dir /tmp/phpa/otherhost ... </VirtualHost>
  ------------------------------------------------------------

  ------- DocumentRoot/nocache/.htaccess(예) -------------------------
php_value phpa 0
  ------------------------------------------------------------

  ------- DocumentRoot/any/path/to/.htaccess(예) -------------
php_value phpa.shm_ttl 3h
  ------------------------------------------------------------

PHPA 외에 다른 PHP 지시자 설정은 다음 URL을 참고하시길 바랍니다.

  - http://www.php.net/manual/en/function.ini-set.php

  <주의>
  httpd.conf 또는 .htaccess 파일에 적용할 경우,
  On  --> 1
  Off --> 0
  on/off로 직접 설정할 경우 잘 작동하지 않은 경우가 있으므로
  이와 같이 on/off에 관한 설정은 가능한 0(off) 또는 1(on)로 설정하도록
  하세요
  </주의>

앞에서 소개하지 않은 기타 PHPA 설정 지시자는 다름과 같이 PHP 스크립트로
프로그램하여 확인할 수 있습니다.

-- phpa-config-debug.php ------------------------------------
<?
function _var_dump($array, $name='', $constants=0)
{ 
  foreach($array AS $k=>$v) {
        if($name) $var = "${name}[\"$k\"]"; else $var = $k;
        if(!$constants) $var = '$'.$var;
        echo "$var = $v<BR>\n";
        if(is_array($v) && sizeof($v)>0) {
                echo "<UL>\n";
                _var_dump($v,$var,1);
                echo "</UL>\n";
        }
  }
}
        
$ini = ini_get_all();
_var_dump($ini,0,1);
?>
--------------------------------------------------------------

-- 출력 결과(예) ---------------------------------------------
phpa = Array phpa["global_value"] = 1 phpa["local_value"] = 1 phpa["access"] = 7 phpa.cache_dir = Array phpa.cache_dir["global_value"] = /tmp/phpa phpa.cache_dir["local_value"] = /tmp/phpa phpa.cache_dir["access"] = 7 phpa.cache_file_prune_period = Array phpa.cache_file_prune_period["global_value"] = 60s phpa.cache_file_prune_period["local_value"] = 60s phpa.cache_file_prune_period["access"] = 1
--------------------------------------------------------------

눈여겨 볼 항목은 각 설정 지시자의 설정권한인 ["access"] 값입니다.
예를 들어 phpa는 7, phpa.cache_dir는 7 phpa.cache_file_prune_period는 1
입니다.

  - http://www.php.net/manual/en/function.ini-set.php

위의 싸이트를 방문하면 이 상수 값(비트)에 대한 설명이 있습니다. 즉,

  - 상수값 1 : user script 파일(xxx.php)에 ini_set()함수로 설정가능
  - 상수값 2 : .htaccess, httpd.conf(vhost)
  - 상수값 4 : php.ini, httpd.conf(not include vhost)
  - 상수값 7 : anywhere

입니다. 각 상수값은 이들의 조합니다.
예를들어, phpa.cache_dir 지시자는 접근권한이 7이므로 php.ini, httpd.conf,
.htaccess, xxx.php 파일 모두에 설정 가능하다는 의미입니다.


그럼 php.ini 파일을 열어서 설정 내용을 추가하거나 편집해 봅시다.
버전마다 설정 내용이 다를 수 있으므로, 반드시 다운로드한 파일에 함께
첨부된 CONFIGURATION 파일의 내용을 적용해야 합니다.

다음의 내용은 PHPA 1.3.2(1.3.3포함)버전입니다. 참고로 php.ini 파일에서 주석은
';'입니다.

------------------------------------------------------------
; <주의> ; 주의할 점은 Zend optimizer와 함께 설정할 수 없습니다. ; </주의> ; zend_extension에 PHPA *.so 파일을 지정합니다. ; zend_extension = /usr/local/lib/php_accelerator_1.3.2.so ; PHP Accelerator 기능을 enable(on) 또는 disable(off) 설정 ; 기본값은 'on' ; ; 설정권한 상수값 7, 그러나 ini_set('phpa',1)는 작동하지 않음 ; phpa = on ; 컴파일된 Accelerator 코드의 최적화 옵션으로 기본값은 'on'. ; 성능 향상에 도움을 주므로 'on'으로 설정하세요. 코드 크기를 줄여주고 ; 속도를 올려줍니다. ; ; 설정권한 상수값 1 ; phpa.tweaks = on ; PHPA 1.3.3에 해당되는 설정지시자입니다. ; PHP를 컴파일할때 --enable-memory-limit 옵션을 주어 컴파일했다면 ; 이 이지자 설정을 On(1)로 설정하도록 하세요. ; 기본값은 '0'입니다. ; ; 설정권한 상수값 1 ; phpa.enable_php_memory_bug_workaround = 0 ; 캐시된 파일을 저장할 디렉토리를 절대 경로로 설정합니다. ; 기본값은 /tmp 이며, 캐시된 파일은 'phpa_xxxx'이라는 이름을 가집니다. ; ; <주의> ; 1. RAM 기반 파일 시스템에 설정하지 않도록 합니다.(T.T) ; 2. NFS 파일 시스템에 설정하지 않도록 합니다. ; </주의> ; ; shm 캐시가 disable 되지 않는 이상, 캐시 파일은 새로 생성되거나, ; 변경된 파일이 캐시되면 캐시 파일은 이 디렉토리에 존재합니다. ; 일부 RAM 기반 파일 시스템은 버그와 메모리 매핑 파일에 문제가 있기 ; 때문에 가능한 디스크 기반 파일시스템에 설정하도록 하세요. ; ; 실제로 필자가 1.1p1 버전을 RAM disk에 올려본적이 있는데 좀전보다 ; 크게 낫은 성능을 내지지 않더군요. ; ; <권장> ; /tmp/phpa 디렉토리를 만들고 /tmp/phpa 디렉토리 퍼미션을 ; 최소한 nobody(아파치 실행 유저)가 쓸 수 있도록 조정하면 ; 훨씬 깔끔 하겠군요. ; # mkdir /tmp/phpa ; # chown nobody.nobody /tmp/phpa ; </권장> ; ; 설정권한 상수값 7 ; phpa.cache_dir = /tmp ; 8진수로 캐시 파일의 퍼미션 설정, 기본값은 400(-r--------). ; ; 설정권한 상수값 1 ; phpa.file_perms = 400 ; PHPA에서 무시할 파일을 콤마(,)로 구분하여 설정합니다. ; 여기에 설정된 파일은 PHPA가 캐시하지 않기 때문에 PHP 코드가 자주 ; 바뀌거나 캐시할 필요가 없는 파일을 그 대상으로 합니다. ; ; 설정한 파일은 시스템 절대 경로나 URL이 아닌 URI중에서 일부분과 ; 일치하면 PHPA에서 캐시하지 않습니다. ; (필자는 모두 캐시하기를 원하기 때문에 주석을 추가했을 뿐) ; ; 설정권한 상수값 7 ; ;phpa.ignore_files = "/index.php,/a/help.php" ; PHPA에서 무시할 디렉토리를 설정합니다. 제일 뒤에 '/'추가. ; 사용법은 phpa.ignore_files과 동일합니다. ; 캐시된 파일과 캐시되지 않은 파일에 대해서 속도를 비교하고자 한다면, ; 특정 디렉토리로 지정하고 같은 파일을 각각 복사해 놓고 테스트하면 ; 됩니다. ; ; 설정권한 상수값 7 ; phpa.ignore_dirs = "/temp/,/tmp/,/nocache/" ; 캐시 디렉토리에 위치한 '/tmp/.prunded' 파일의 갱신 주기(period) 설정. ; 'pruning'은 캐시 디렉토리를 읽어들여(scan) 정렬할때 사용합니다. ; 단위는 s(seconds), m(minutes), h(hours), d(days)로 설정가능하며, ; 기본값은 1h(1시간)이고, 0으로 설정하면 'cache purning'을 disable한다. ; ; 설정권한 상수값 1 ; phpa.cache_file_prune_period = 1h ; 하나의 캐시 파일에 대한 ttl(time to live) 설정. (광고의 ttl이 아님^.^) ; 즉 네임서버에서 설정한 TTL과 같은 개념입니다. ; 기본값은 1d(하루)입니다. ; 하루단위나 기타 정기적으로 웹서버를 restart 할 경우는 그 기간보다 더 ; 길게 설정하고, 캐시 파일을 자주 업데이트할고자 한다면 ttl을 짧게 잡아 ; 주도록 합니다. ; ; <주의> ; 캐시파일은 설정한 ttl 시간 안에 PHP코드가 바뀌면 다시 갱신되므로 ; 강제로 캐시파일을 지울 필요는 없습니다. ; </주의> ; ; 설정권한 상수값 1 ; phpa.cache_file_ttl = 1d ; PHPA가 사용하는 공유 메모리(shm, shared memory) 캐시 크기를 megabytes ; 단위로 설정합니다. ; 기본값은 8MB이고 물리적 메모리 여유가 된다면 더 크게 잡아줍니다. ; PHPA에서 사용한 메모리 정보를 알고 싶다면 'phpa_cache_admin -mv' 실행. ; ; 설정권한 상수값 1 ; phpa.shm_size = 8 ; 공유메모리 키 설정. ; 기본값은 0xc0deb00 ; ; 설정권한 상수값 1 ; phpa.shm_key = 0xc0deb00 ; 공유메모리 퍼미션(8진수) 설정. ; 기본값은 666(-rw-rw-rw). ; 공유메모리 유저(phpa.shm_user)에게만 접근을 허용하려면 600 정도로 설정. ; ; 설정권한 상수값 1 ; phpa.shm_perms = 644 ; 공유메모리 캐시 유저 설정. ; httpd.conf 파일에서 User 지시자에 설정한 유저를 의미. ; (nobody, www, apache ...) ; 1.3.2 이상 버전부터는 자동으로 설정되니 굳지 설정할 필요는 없습니다. ; ; <주의> ; 그러나, 이 설정을 하지 않으면, 'phpa_cache_admin -m' 실행시, ; No shm cache available with key 0x0c0deb00. Check ; 와 같은 메시지를 내므로 이 유틸리티를 사용하고자 한다면 해당 유저를 ; 설정하는 것이 좋습니다. ; </주의> ; ; 설정권한 상수값 1 ; phpa.shm_user = nobody ; 공유메모리 캐시 그룹 설정 ; httpd.conf 파일에서 Group 지시자에 설정한 그룹을 의미. ; (nobody, www, apache ...) ; ; 설정권한 상수값 1 ; phpa.shm_group = nobody ; 웹 서버가 종료될 때 공유메모리와 세마포어를 자동적으로 풀어 놓을 것인지 ; 설정하는 항목입니다. ; 기본값은 on 입니다. ; ; 설정권한 상수값 1 ; phpa.shm_release_at_exit = on ; 공유메모리 체크(rebalancing) 주기 시간 설정. ; <주의> ; PHPA는 PHP 코드가 변경되면 항상 다시 캐시합니다. ; </주의> ; 기본값은 5m(5분)이며, s(seconds), m(minutes), h(hours), d(days)로 ; 설정가능 합니다. ; ; 설정권한 상수값 1 ; phpa.shm_stats_check_period = 5m ; 공유메모리 ttl(time to live) 설정 ; 기본값은 12h(12시간)이며, s(seconds), m(minutes), h(hours), d(days)로 ; 설정가능 합니다. ; ; 설정권한 상수값 7 ; phpa.shm_ttl = 12h ; 공유메모리 캐시에서 제외할 파일 설정. ; 설정 방법은 'php.ignor_files'와 동일합니다. ; ; 설정권한 상수값 7 ; ;phpa.shm_ignore_files = "/index.php,/a/help.php" ; 공유메모리 캐시에서 제외할 디렉토리 설정. ; 설정 방법은 'php.ignor_dirs'와 동일합니다. ; ; 설정권한 상수값 7 ; phpa.shm_ignore_dirs = "/tmp/,/temp/,/nocache/" ; 최대 공유메모리 수 설정. ; 즉 아파치 Maxclients 보다 더 크게 설정하면 됩니다. ; 기본값은 512입니다. ; ; 설정권한 상수값 1 ; phpa.shm_max_processes = 512 ; 하나의 프로세스가 lock을 얻기 위해서 기다리는 시간을 초단위로 ; 설정합니다(warning에 관한 로그). ; ; 설정권한 상수값 1 ; phpa.shm_lock_threshold0 = 10 ; 캐시 lock을 중단(break)하기 위해서 기다리는 시간을 초단위로 설정. ; ; 설정권한 상수값 1 ; phpa.shm_lock_threshold1 = 10
------------------------------------------------------------

만약 1.3.2 이하의 버전을 사용할 계획이라면(?) 앞서 얘기했듯이
'activation keys'를 설정해줘야 합니다. 이 키의 대상은 httpd.conf
파일에서 ServerName 지시자로 설정한 모든 호스트가 그 대상입니다.
ServerAlias 지시자로 설정한 호스트는 그 대상이 아닙니다.

'activation keys'를 설정하는 방법은 하나 하나의 ServerName에 대해서
아파치 가상 호스트의 각 섹션에,

  php_value phpa.registration_key xxxxxxxxxxxxxx

으로 설정하는 방법과 'phpa.keys' 파일을 생성하여 설정한 방법이 있습니다.
후자의 방법이 더 효율적이므로 이 방법을 권장합니다.

# cat /usr/local/apache/conf/httpd.conf | egrep "^[^#]*ServerName" ServerName localhost ServerName www.linux.ac.kr ServerName myhost.net ServerName myhost.com ServerName home.linux.ac.kr ServerName mail.linux.ac.kr #

ServerAlias가 아닌 ServerName 지시자로 설정한 모든 호스트에 대해서
다음의 싸이트를 방문하여 key 파일을 생성하여 다운로드합니다.

  [Download Activation Keys] 항목
  - http://www.php-accelerator.co.uk/activate.php

앞의 호스트를 예를 들자면,

  --------- phpa.keys ------------------------------
localhost f5eaa9f7856d20312d755d6c29bc5d42 www.linux.ac.kr 50bb1185c863f8e6dec18dda5c3766d2 myhost.net 61b36f78c681ca85ea9514ca174e2ed3 myhost.com 2d29a4df6fde7b0f3a5f4b877fa6b4fb home.linux.ac.kr 7f3e5ce1a68f1c20adff30b5f73f6366 mail.linux.ac.kr 2bb06f20b0966dca91f42b8b697e1db8
  ---------------------------------------------------

이와 같습니다. 이 파일에서 '#'은 주석이므로 필요없는 호스트에 대해서
삭제하거나 주석(#)을 추가하면 됩니다.

생성된 phpa.keys 파일을 /usr/local/apache/conf/phpa.keys 또는
/usr/local/lib/php.keys 위치로 옮겨놓고 php.ini 파일을 다음과 같이
수정합니다.

  [수정 전]
  phpa.registration_keys_file = <file> 

  [수정 후]
  phpa.registration_keys_file = /usr/local/apache/conf/phpa.keys

이상으로 php.ini 설정은 모두 끝났습니다.
설명이 좀 길었지만 비교적 어려운 편은 절대 아닙니다.


3. 작동확인

php.ini 설정이 모두 끝났으면 아파치를 재시작합니다.

# apachectl restart (기타 원하는 방법대로)

작동을 확인하는 방법은 우선 phpinfo.php 파일을 적당한 DocumentRoot에
생성하고 다음의 내용을 추가합니다.

  ------ phpinfo.php --------------------------------
  <?
  var_dump($GLOBALS['_PHPA']);
  echo "<HR>\n";
  phpinfo();
  ?>

  ---------------------------------------------------


  [웹브라우저로 확인할 경우]
array(3) { ["ENABLED"]=> bool(true) ["iVERSION"]=> int(10302) ["VERSION"]=> string(5) "1.3.2" } This program makes use of the Zend Scripting Language Engine: Zend Engine v1.2.0, Copyright (c) 1998-2002 Zend Technologies with the ionCube PHP Accelerator v1.3.2, Copyright (c) 2001-2002, by Nick Lindridge


  [telnet으로 확인할 경우]
# telnet localhost 80 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. HEAD /phpinfo.php HTTP/1.0 <-- 직접 입력 <-- <ENTER> 입력 HTTP/1.1 200 OK Date: Thu, 01 Aug 2002 01:38:14 GMT Server: Apache/1.3.24 (Unix) mod_perl/1.27 PHP/4.2.1 mod_ssl/2.8.8 OpenSSL/0.9.6c X-Powered-By: PHP/4.2.1 X-Accelerated-By: PHPA/1.3.2 <-- 확인 사항 Set-Cookie: PHP_SID=a6f5c749410253a3e3bc052095e1db92; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Connection: close Content-Type: text/html Connection closed by foreign host.
 

  [lynx로 확인할 경우]
# lynx -head -source -useragent='Mozilla/4.0' http://localhost/phpinfo.php HTTP/1.1 200 OK Date: Thu, 01 Aug 2002 01:42:32 GMT Server: Apache/1.3.24 (Unix) mod_perl/1.27 PHP/4.2.1 mod_ssl/2.8.8 OpenSSL/0.9.6c X-Powered-By: PHP/4.2.1 X-Accelerated-By: PHPA/1.3.2 <-- 확인 사항 Set-Cookie: PHP_SID=4dd63685ea4511eb8ecd786e59315caf; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Connection: close Content-Type: text/html

  [wget으로 확인할 경우]
# wget -S --spider --user-agent='Mozilla/4.0' http://localhost/phpinfo.php --01:46:26-- http://localhost:80/phpinfo.php => `phpinfo.php' Connecting to localhost:80... connected! HTTP request sent, awaiting response... 200 OK 2 Date: Thu, 01 Aug 2002 11:56:26 GMT 3 Server: Apache/1.3.24 (Unix) mod_perl/1.27 PHP/4.2.1 mod_ssl/2.8.8 OpenSSL/0.9.6c 4 X-Powered-By: PHP/4.2.1 5 X-Accelerated-By: PHPA/1.3.2 <-- 확인 사항 6 Set-Cookie: PHP_SID=55eef3a4dcfdc75eaa7d743867bfcf4b; path=/ 7 Expires: Thu, 19 Nov 1981 08:52:00 GMT 8 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 9 Pragma: no-cache 10 Connection: close 11 Content-Type: text/html 12 200 OK


이와 같이 'X-Accelerated-By: PHPA/1.3.2' 항목이 나오면 정상적으로 작동한다는
의미입니다.


4. 간단한 속도 테스트

PHPA 벤치마크에 관한 내용은 다음의 싸이트에서 볼 수 있습니다.

  - http://www.phpinsider.com/benchmarks/
  - http://www.php-accelerator.co.uk/testimonials.php

그럼 실제로 한번 간단하게 속도 테스트를 해봅시다.
주의할 점은 객관적인 절대적인 수치가 아니므로 대충 어느 정도로만 판단하시길
바랍니다.

우선 php.ini 파일을 다음과 같이 수정하고 아파치를 재시작합니다.

  ------------ php.ini -----------------------------------
auto_prepend_file = /usr/local/apache/header.php auto_append_file = /usr/local/apache/footer.php phpa.ignore_files = "/nocache/test.php" phpa.ignore_dirs = "/tmp/,/temp/,/nocache/" phpa.shm_ignore_files = "/nocache/test.php" phpa.shm_ignore_dirs = "/tmp/,/temp/,/nocache/"
  ---------------------------------------------------------

  ------------ 또는 DocumentRoot/nocache/.htaccess---------
php_value auto_prepend_file /usr/local/apache/header.php php_value auto_append_file /usr/local/apache/footer.php php_value phpa 0
  --------------------------------------------------------- 

  ------------ header.php ---------------------------------
  <? $_start = microtime(); ?>

  ---------------------------------------------------------

  ------------ footer.php ---------------------------------
  <?
  if(!function_exists(get_microtime)) {
    function get_microtime($_start, $_end)
    {
      $end = explode(" ", $_end);
      $start = explode(" ", $_start);

      ## (A+A')-(B+B') better than (A-B)+(A'-B')
      return sprintf("%.4f", ($end[1] + $end[0]) - ($start[1] + $start[0]));
    }
  }

  if(!$not) {
    echo "<BR>\n";
    echo get_microtime($_start,microtime());
  }
  ?>

  ---------------------------------------------------------

그리고 적당한(비교적 긴 시간이 요구되는) PHP 코드를 작성하여(예: test.php)
DocumentRoot/cache.php와 DocumentRoot/nocahe/test.php 파일로 각각 복사합니다.

웹브라우저로 요청하면 제일 하단에 실행속도가 표시되므로 서로 비교하시면 됩니다.

아래는 필자가 테스트한 수치(절대적인 수치가 아님)입니다.

  - glibc/2.2(레드햇 7.0기반)
  - Apache/1.3.24
  - PHP/4.2.1
  - PHPA/1.3.2
  - Zend optimizer/1.3.1
  - (Zend Accelerator 는 제외함)

  - 테스트 1 : for($i=0; $i<1000000; $i++) ;
  - 테스트 2 : JSBoard 1.3.7/MySQL 3.23.51(localhost)

  - 결과
---------------------------------------------------------- 구분 테스트 1 테스트 2 (list/read) ---------------------------------------------------------- none 3.64 0.33/0.33 Zend optmizer 1.47 0.33/0.33 PHPA 3.23 0.12/0.17 ----------------------------------------------------------

테스트 1은 오히려 PHPA보다 Zend optimizer가 더 빠른 결과를 냅니다.
즉 단순한 수학적인(?)인 계산에서는 Zend optimizer가 더 빠르지만
대부분의 홈페이지가 이와 같이 단순하게 구성되어 있지 않다는 점을 간과해서는 안됩니다.
테스트 2의 결과를 보면 확실하게 알 수 있습니다.

결론적으로
아주 단순한 수학적인 계산이 많이 들어가 있고 비교적 PHP 코드가 적은 홈페이지인
경우에는 Zend optimizer가 더 유리하지만 그렇지 않은 일반적인 홈페이지나 쇼핑몰 정도의
수준에서는 역시 PHPA가 더 유리합니다.

PHPA가 Zend Accelerator에 근접한 수치를 낸다는 점을 감안했을 때 왜 Zend Accelerator가
상용으로 서비스되고 있는지 생각해 보면 쉽게 그 해답을 찾을 수 있습니다.


5. 관리자용 유틸리티 PHPACA

/usr/local/bin/phpa_cache_admin 유틸리티를 이용해서 메모리 사용을 볼 수 있습니다.

  <주의>
  phpa.shm_user = nobody
  phpa.shm_group = nobody
  이 설정을 하지 않으면, 'phpa_cache_admin -m' 실행시,
  'No shm cache available with key 0x0c0deb00. Check'
  와 같은 메시지를 내므로 가능한 이와 같이 설정하세요.
  </주의>

----------------------------------------------------
# phpa_ache_admin -vm shm size 8.0MB bytes mempool size 8.0MB mempool bytes allocated 64.0KB mempool max bytes allocated 64.0KB mempool bytes free 7.9MB mempool overhead 8.1KB cache enabled # # phpa_ache_admin -m 8388608:8372136:65536:65536:8298348:8252:0:0:m # # phpa_cache_admin --help Usage: -k <key> | --shm-key <key> Specify the shm cache key in either decimal or hex (with 0x prefix) Defaults to 0x0c0deb00 -m | --mem-info Dump memory usage info. Dumped fields are: shared memory segment size memory available for shm cache bytes allocated to cache entries maximum bytes ever allocated to cache entries free bytes available in cache cache overhead in bytes cache enable/disable status or disabled time cache reinitialise status or time -f | --file-info Dump cache entries. Dumped fields are: time to cache entry expiry time to live setting source filename filesize of phpa_* cache file source script file device number source script file inode number source script modification time (seconds since 0 hours UTC, Jan1, 1970) source script cache time (seconds since 0 hours UTC, Jan1, 1970) -p | --process-info Dump process stats and table entries. Dumped process stats are: count processes using cache maximum count of processes using cache count of active requests maximum count of active requests Dumped process entry fields are: process id request start time file device file inumber file path Entries are only given for processes with active requests, and one line is shown for each included/required file per process. It is possible that the same file may be listed more than once per process. -d | --disable-cache Disable the cache. Once disabled, new requests will not use the shm cache but still make use of the file cache. -e | --enable-cache Enable the shm cache. -r | --reinitialise-cache Reinitialise the shm cache. If there are no active server requests then the cache is reinitialised immediately. Otherwise the cache is disabled, set to reinitialise, and will be reinitialised when the last server request completes. After reinitialisation the cache is enabled. -D | --delete-cache Deletes the shm cache immediately. Using this while the web server is running will break phpa. Use it if the shared memory hasn't been deleted after a previous restart/shutdown and if phpa logs warnings about being unable to map the shared memory. A failsafe restart procedure should be to stop apache, kill any httpd processes that didn't exit, run 'phpa_cache_admin -D', restart web server. -v | --verbose This may be specified to give more verbose output to the -f, -m and -p options. -V | --version Display the PHPA version. -h | --help | -? This text.
----------------------------------------------------

또한 다음의 싸이트를 방문하여 phpaca.tgz 파일을 다운로드하여 직접 웹에서
확인할 수 있습니다. Zend Accelerator에서 사용한 툴과 비슷하네요.
(기능은 많이 떨어지기는 하지만...)

  - http://www.edinger.info/phpaca.php

참고로 1.3.2 버전에는 flush-phpa-cache 유틸리티를 제공하지 않기 때문에
다운로드한 phpaca.tgz 파일을 압축 풀고, config.inc.php 파일에서

  DEFINE(CACHE_FLUSH,'');
  또는
  DEFINE(CACHE_FLUSH,'/usr/local/bin/phpa_cache_admin');

으로 설정하도록 하세요.

참고로 MSIE에서는 보이지 않은 버그가 있군요.


6. 기타 정보

나중을 위해서.......


7. 후기

이 문서 작성하겠다고 마음먹은지 벌써 반년이 지났군요.....T.T

잘못된 점이나 보강할 내용이 있으면,

  http://www.linuxchannel.net/board/?table=qna

에 올려주시면 감사하겠습니다.


EOF

댓글목록

등록된 댓글이 없습니다.

PHP
871 (10/18P)

Search

Copyright © Cmd 명령어 52.15.37.74