저는 최근 한동안 프로그램 성능 최적화 작업을 진행해 왔는데, 흥미로운 아이디어가 있어 여러분과 공유하고 싶습니다.
캐시는 "시간을 위한 공간" 전략의 전형적인 적용 모드이자 시스템 성능을 향상시키는 중요한 방법입니다. 캐시를 사용하면 액세스 볼륨이 큰 경우 데이터베이스 작업 수를 크게 줄여 시스템 부하를 크게 줄이고 시스템 성능을 향상시킬 수 있습니다. 페이지 캐싱에 비해 결과 집합은 형식 정보가 포함되지 않은 일종의 "원시 데이터"이므로 데이터 양이 상대적으로 적고 다시 형식을 지정할 수 있으므로 매우 유연합니다. PHP는 "컴파일과 동시에 실행"하는 스크립팅 언어이기 때문에 결과 집합 캐싱을 어느 정도 사용하는 매우 편리한 방법, 즉 해당 데이터 정의 코드 세그먼트를 동적으로 포함하여 캐시를 사용하는 방법도 제공합니다. "RamDisk"에 캐시를 구축하면 효율성이 더욱 향상됩니다. 다음은 참조용 작은 샘플 코드입니다.
// 캐시로 데이터 로드
함수 load_data($id,$cache_lifetime) {
// 반환 데이터
$데이터 = 배열();
// 캐시 파일명 만들기
$cache_filename = 'cache_'.$id.'.php';
// 캐시 파일의 마지막 수정 시간을 확인합니다.
$cache_filetime = 파일mtime($cache_filename);
if (time() - $cache_filetime <= $cache_lifetime) {
//** 캐시가 만료되지 않았습니다.
include($cache_filename);
} 또 다른 {
//** 캐시가 만료되었습니다.
// 데이터베이스에서 데이터를 로드합니다.
// ...
동안($dbo->nextRecord()) {
// $data[] = ...
}
// 데이터를 PHP 파일로 포맷합니다.
$data_cache = "
while (list($key, $val) = 각각($data)) {
$data_cache .= "$data['$key']=배열('";
$data_cache .= "'NAME'=>"".qoute($val['NAME'])."","
$data_cache .= "'VALUE'=>"".qoute($val['VALUE'])."""
$data_cache .= ";);rn";
}
$data_cache = "?>rn";
// 캐시 파일에 데이터를 저장합니다.
if ($fd = fopen($cache_filename,'w+')) {
fputs($fd,$data_cache);
fclose($fd);
}
}
$data를 반환합니다.
}
?>
적용 가능한 상황:
1. 데이터는 비교적 안정적이며 주로 읽기 작업입니다.
2. 파일 작업은 데이터베이스 작업보다 빠릅니다.
3. 복잡한 데이터 액세스, 대용량 데이터 볼륨 액세스, 집중적인 데이터 액세스 및 시스템 데이터베이스에 대한 과도한 로드.
4. 웹/DB 분리 구조 또는 멀티 웹 단일 DB 구조.
확인되지 않은 질문:
1. 동시 액세스 중에 파일을 읽고 쓰는 경우 잠금 문제가 발생합니다.
2. 관련된 데이터 파일이 너무 많을 때 성능은 어떻습니까?
확장 아이디어:
1. JavaScript 데이터 정의 코드를 생성하고 클라이언트에서 호출합니다.
2. 아직 생각해본 적 없는데…
함께 논의하길 바랍니다.
은닉처
거대한 PHP 애플리케이션의 성능을 향상시키려면 캐싱을 사용하는 것도 좋은 방법입니다. Zend Cache, APC, Afterburner Cache 등 다양한 캐싱 솔루션을 사용할 수 있습니다.
이 모든 제품은 "캐싱 모듈"입니다. .php 파일에 대한 요청이 처음 발생하면 웹 서버의 메모리에 PHP 중간 코드를 저장한 다음 "컴파일된" 버전으로 후속 요청에 응답합니다. 이 접근 방식은 디스크 액세스를 최소한으로 줄이고(코드를 읽고 구문 분석함) 코드가 메모리에서 직접 실행되어 서버가 요청에 훨씬 빠르게 응답하기 때문에 애플리케이션 성능을 실제로 향상시킬 수 있습니다. 물론 캐싱 모듈은 PHP 소스 파일의 변경 사항을 모니터링하고 필요한 경우 페이지를 다시 캐시하므로 사용자가 오래된 PHP 코드로 인해 여전히 생성된 페이지를 가져오는 것을 방지할 수 있습니다. 캐싱 모듈은 서버의 부하를 크게 줄이고 PHP 애플리케이션의 응답 효율성을 향상시킬 수 있으므로 부하가 많은 웹 사이트에 매우 적합합니다.
캐싱 제품을 선택하는 방법
Zend Cache는 앞서 언급한 Zend Technologies의 상용 소프트웨어로 PHP 엔진과 무료 Zend Optimizer를 제공합니다. Zend Cache는 정말 가치가 있습니다! 대규모 PHP 페이지의 경우 처음 실행한 후 속도가 빨라지고 서버에서 사용 가능한 리소스가 더 많아지는 것을 느낄 수 있습니다. 불행히도 이 제품은 무료는 아니지만 어떤 경우에는 여전히 큰 가치가 있을 수 있습니다.
Afterburner Cache는 Bware Technologies의 무료 캐싱 모듈입니다. 이 제품은 현재 베타 버전입니다. Afterburner Cache는 Zend Cache와 유사해 보이지만 (아직은) Zend Cache만큼 성능이 향상되지 않으며 Zend Optimizer와도 작동하지 않습니다.
APC는 Community Connect의 또 다른 무료 캐싱 모듈인 Alternative PHP Cache의 약어입니다. 이미 정식으로 사용해도 될 만큼 제품이 안정적이고, 요청에 대한 응답 속도도 대폭 향상되는 것 같습니다.
압축 정보
Remote Communications의 무료 Apache 모듈 mod_gzip에는 이러한 유형의 콘텐츠 인코딩을 지원하는 브라우저에 대해 정적 웹 콘텐츠를 압축하는 기능이 있습니다. 대부분의 정적 웹 콘텐츠의 경우 mod_gzip이 매우 잘 작동합니다. mod_gzip은 Apache로 쉽게 컴파일할 수 있으며 DSO로도 사용할 수 있습니다. Remote Communications에 따르면 mod_gzip은 mod_php, mod_perl 등의 동적 콘텐츠를 압축할 수도 있습니다. 계속해서 시도해 보았지만 효과가 없는 것 같았습니다. mod_gzip에 대한 많은 포럼과 기사를 읽었으며 이 문제는 mod_gzip의 다음 버전(아마 1.3.14.6f)에서 해결될 것으로 예상됩니다. 그때까지는 웹사이트의 정적 부분에서 mod_gzip을 사용할 수 있습니다.
그러나 동적 콘텐츠를 압축하고 싶지 않은 경우가 있으므로 다른 방법을 찾아야 합니다. 한 가지 방법은 PHP 스크립트의 시작과 끝에서 클래스의 특정 기능을 호출하여 페이지의 콘텐츠를 압축하는 데 사용할 수 있는 PHP 클래스인 class.gzip_encode.php를 사용하는 것입니다. 웹사이트 수준에서 이 솔루션을 구현하려면 php.ini 파일의 auto_prepend 및 auto_append 지시문에서 이러한 함수를 호출할 수 있습니다. 이 방법은 효과적이지만 로드가 많은 웹 사이트에 더 많은 오버헤드를 가져온다는 것은 의심할 여지가 없습니다. 이 클래스를 사용하는 방법에 대한 자세한 지침은 해당 소스 코드를 참조하세요. 소스 코드 설명은 매우 완벽하며, 저자는 여러분이 알아야 할 모든 것을 알려줍니다.
PHP 4.0.4에는 이전 클래스와 유사하지만 사용법이 다른 새로운 출력 캐시 핸들러 ob_gzhandler가 있습니다. ob_gzhandler를 사용할 때 다음 내용을 php.ini에 추가해야 합니다:
output_handler = ob_gzhandler;
이 코드 줄은 PHP가 출력 캐싱을 활성화하고 전송되는 모든 것을 압축하도록 합니다. 어떤 이유로 이 코드 줄을 php.ini에 추가하지 않으려면 PHP 소스 파일이 있는 디렉터리의 .htaccess 파일을 통해 기본 서버 동작(압축 없음)을 변경할 수도 있습니다. 다음과 같습니다:
php_value 출력_핸들러 ob_gzhandler
또는 다음과 같이 PHP 코드에서 호출합니다: ob_start("ob_gzhandler");
출력 캐시 핸들을 사용하는 방법은 실제로 매우 효과적이며 서버에 특별한 부하를 주지 않습니다. 그러나 Netscape Communicator는 압축된 그래픽을 제대로 지원하지 않으므로 모든 사용자가 IE 브라우저를 사용하도록 보장할 수 없다면 압축된 JPEG 및 GIF 그래픽을 비활성화해야 합니다. 일반적으로 이 압축은 다른 모든 파일에 적용되지만, 특히 특수 플러그인이나 데이터 뷰어를 사용하는 경우 각 브라우저에 대해 별도로 테스트하는 것이 좋습니다.