PEAR를 사용하여 PHP 프로그램 버퍼링
버퍼링은 PHP 세계에서 뜨거운 주제입니다. 왜냐하면 PHP가 생성한 동적 페이지는 요청 결과가 동일한지 여부에 관계없이 사용자가 요청할 때마다 다시 계산해야 하기 때문입니다. 동시에 PHP는 매번 스크립트를 컴파일합니다. 이러한 과부하는 트래픽이 많은 웹사이트에서는 확실히 견딜 수 없을 것입니다. 다행히도 스크립트를 다시 실행하고 컴파일할 필요 없이 웹 결과를 캐시할 수 있습니다. ZendCache나 오픈 소스 Alternate PHP Cache와 같은 상용 제품은 PHP 스크립트를 바이트 코드로 컴파일하고 캐시하는 방법을 제공합니다.
PEAR의 버퍼링 패키지는 동적 콘텐츠, 데이터베이스 쿼리 및 PHP 함수 호출을 버퍼링하기 위한 프레임워크를 제공합니다.
Perl에 CPAN이 있고 TeX에 CTAN이 있는 것처럼 PHP에도 클래스, 라이브러리 및 모듈을 저장하는 자체 중앙 리소스 라이브러리가 있습니다. 이 라이브러리를 PEAR(PHP 확장 및 추가 기능 저장소)라고 합니다.
이 글에서는 PEAR 환경을 설치했다고 가정합니다. 그렇지 않은 경우 PHP 웹사이트에서 다운로드할 수 있습니다. PEAR의 버퍼 패키지에는 전체 버퍼 클래스와 여러 특수 하위 클래스가 포함되어 있습니다. 버퍼 클래스는 컨테이너 클래스를 사용하여 버퍼링된 데이터를 저장하고 관리합니다.
다음은 현재 PEAR 버퍼에 포함된 컨테이너와 해당 매개변수입니다.
file — 파일 컨테이너는 버퍼링된 데이터를 파일 시스템에 저장하며 가장 빠른 컨테이너입니다.
캐시_디렉터리 — 컨테이너가 파일을 저장하는 디렉터리입니다.
filename_prefix — 캐시된 파일의 접두사입니다(예: "cache_").
shm — shm 컨테이너는 버퍼링된 데이터를 공유 메모리에 저장합니다. 벤치마크에 따르면 현재 구현에서는 이 컨테이너가 파일 컨테이너보다 느립니다.
shm_key — 공유 메모리에서 사용되는 키입니다.
shm_perm — 공유 메모리 데이터 세그먼트를 사용하기 위한 권한입니다.
shm_size — 할당된 공유 메모리의 크기입니다.
sem_key — 세마포어의 키 값입니다.
sem_perm — 세마포어에 대한 권한입니다.
db — PEAR의 데이터베이스 추상화 계층.
dsn — 데이터베이스 연결의 DSN입니다. PEAR의 DB 문서를 참조할 수 있습니다.
캐시_테이블 — 테이블의 이름입니다.
phplib — phplib 컨테이너는 데이터베이스 추상화 계층을 사용하여 버퍼를 저장합니다.
db_class
db_파일
db_path
local_file
local_path
ext/dbx - PHP의 데이터베이스 추상화 계층 확장입니다. 데이터베이스에 버퍼를 저장하려는 경우 이 컨테이너를 사용할 수 있습니다.
기준 치수
주인
디비
사용자 이름
비밀번호
캐시_테이블
지속성 있는
PEAR Cache를 사용하여 얻은 성능 향상은 선택한 버퍼 컨테이너에 따라 다릅니다. 예를 들어 데이터베이스 결과를 데이터베이스 캐시에 다시 저장하는 것은 의미가 없습니다.
PEAR Cache의 함수 버퍼 모듈은 PHP의 내장 함수이든 사용자 정의 함수이든 관계없이 모든 함수나 메서드의 결과를 버퍼링할 수 있습니다. 기본적으로 파일 컨테이너를 사용하고 버퍼링된 데이터를 function_cache라는 디렉터리에 저장합니다.
Cache_Function 클래스의 생성자에는 세 가지 선택적 매개 변수가 있을 수 있습니다.
$container: 버퍼 컨테이너의 이름입니다.
$container_options: 버퍼 컨테이너의 배열 매개변수입니다.
$expires: 버퍼 개체가 만료되는 시간(초)입니다.
일반 함수 호출이 Cache_Function 클래스의 call() 메서드를 사용하면 버퍼링이 트리거될 수 있습니다. call()을 호출하는 것은 쉽습니다. 하나의 인수는 함수 이름이고 그 다음은 함수의 인수이고 두 번째 인수는 호출할 함수 중 첫 번째 인수입니다. 예를 살펴보겠습니다.
예제 1 버퍼 함수 및 메서드 호출
//PEAR Cache의 함수 버퍼를 호출합니다.
require_once '캐시/Function.php';
// 일부 클래스와 함수를 정의합니다.
클래스 foo {
함수 표시줄($test) {
echo "foo::bar($test)
";
}
}
클래스 바 {
함수 foobar($object) {
echo '$'.$object.'->foobar('.$object.')
';
}
}
$bar = 새 바;
함수 foobar() {
에코 'foobar()';
}
// Cache_Function 개체를 가져옵니다.
$cache = 새로운 Cache_Function();
// foo 클래스(foo::bar())의 정적 함수 bar()를 버퍼링합니다.
$cache->call('foo::bar', '테스트');
// $bar->foobar()
$cache->call('bar->foobar', 'bar');
$cache->call('foobar');
?>
아래에서는 Cache_Output을 사용하여 출력을 버퍼링합니다.
예제 2 버퍼링 스크립트 출력
//PEAR 캐시의 출력 버퍼 로드
require_once '캐시/Output.php';
$cache = new Cache_Output('file', array('cache_dir' => '.') );
// 버퍼링할 페이지의 표시를 계산합니다. 페이지의 버퍼링은 다음에 따라 결정된다고 가정합니다.
// URL, HTTP GET 및 POST 변수와 쿠키.
$cache_id = $cache->생성ID(
array('url' => $REQUEST_URI, '
게시' => $HTTP_POST_VARS, '쿠키' => $HTTP_COOKIE_VARS) );
// 쿼리 버퍼
if ($content = $cache->start($cache_id)) {
//버퍼 적중
$ 내용을 에코;
주사위();
}
//버퍼 손실
// -- 코드를 생성하려면 여기에 내용을 삽입하세요 --
// 페이지를 버퍼에 저장
echo $cache->end();
?>
Cache_Output 클래스를 사용하면 동적 데이터베이스 기반 웹사이트 애플리케이션을 정적 애플리케이션으로 쉽게 변환하여 사이트 성능을 크게 향상시킬 수 있습니다. 점점 더 많은 사이트에서 HTML 콘텐츠를 압축하기 위해 GZIP을 사용하고 있습니다. 이는 서버의 대역폭 소비를 줄이고 모뎀을 사용하여 인터넷에 액세스하는 사용자에게 많은 이점을 줄 수 있습니다.
Cache_OutputCompression은 Cache_Output 클래스의 기능을 확장하여 GZIP 압축 HTML 콘텐츠를 버퍼링하므로 CPU 압축 시간이 절약됩니다.