>  기사  >  php教程  >  캐싱 기술에 대한 자세한 논의 - PHP

캐싱 기술에 대한 자세한 논의 - PHP

黄舟
黄舟원래의
2016-12-14 11:43:041089검색

1. 소개

최근 등장한 웹 디자인 스크립팅 언어인 PHP는 그 강력함과 확장성으로 인해 전통적인 ASP인 PHP에 비해 최근 몇 년 동안 큰 발전을 이루었습니다. mssql에서 php로 60,000개의 데이터를 전송하려면 40초가 걸리고, asp는 2분도 안걸립니다. 데이터를 더 빨리 호출하고 싶어서 불필요합니다. 데이터베이스에서 삭제될 때마다 파일이나 특정 메모리 주소 등 다른 곳에서 삭제될 수 있습니다. 이것이 바로 PHP의 캐싱 기술인 Cache 기술입니다. .

2. 심층 분석

일반적으로 캐싱의 목적은 데이터를 한 곳에 모아서 액세스 속도가 가장 빠르다는 점에는 의심의 여지가 없습니다. 물론, 때로는 일시적으로 서버 캐시에 저장되기도 합니다. 예를 들어 ob_start() 캐시 페이지가 켜져 있으면 페이지 내용이 메모리에 캐시됩니다. 파일 헤더를 보내기 전에 페이지 출력이 자동으로 지워지거나 ob_get_contents의 반환을 기다리거나 ob_end_clean에 의해 표시될 때까지 정적 페이지 생성에 잘 활용되고 템플릿에 잘 반영될 수 있는 Clearance는 다음과 같습니다. 하지만 이는 일시적이고 문제를 해결하는 좋은 방법이 아닙니다.

또한 ASP에는 공용 매개변수를 저장할 수 있는 개체 응용 프로그램이 있습니다. 실제로, asp.net 페이지 캐싱 기술은 viewstate를 사용하며, 캐시는 파일 연결(반드시 정확하지는 않음)입니다. 파일이 수정되지 않고 시간 초과되지 않으면(참고 1) 캐시를 읽고 결과가 반환됩니다. 아이디어를 얻으려면 다음 소스 코드를 살펴보세요.


PHP:[클립보드에 복사]
class 캐시{
/*
클래스 이름: 캐시
설명: 데이터를 캐시하는 제어, $cache_out_time은 캐시를 저장하는 배열입니다. 날짜 시간 초과
버전: 1.0
작성자: old farmer cjjer
최종 수정:2006-2-26
작성자 URL: http://www.cjjer.com
*/
private $cache_dir;
private $expireTime=180;//캐시 시간은 60초입니다.
function __construct($cache_dirname){
if(!@is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn('캐시 파일이 존재하지 않아 생성할 수 없습니다. 수동으로 생성해야 합니다.')
return false ;
}
}
$this->cache_dir = $cache_dirname;
}
function __destruct(){
echo '캐시 클래스 안녕.' 🎜>
function get_url() {
if (!isset($_SERVER['REQUEST_URI'])) {
$url = $_SERVER['REQUEST_URI']
}else{
$url = $_SERVER['SCRIPT_NAME'];
$url .= (!empty($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : ''; >}

return $url;
}

function warning($errorstring){
echo "오류 발생:

".$errorstring."
";
}

function 캐시_페이지( $pageurl,$pagedata){
if(!$fso=fopen($pageurl,'w')){
$this->warns('캐시된 파일을 열 수 없습니다.');//trigger_error
return false; >}
if(!flock($fso,LOCK_EX)){//LOCK_NB, 배타적 잠금
$this->warns('캐시 파일을 잠글 수 없습니다.') ;//trigger_error
return false;
}
if(!fwrite($fso,$pagedata)){//바이트 스트림 쓰기, 직렬화는 다른 형식 쓰기
$this-> ;warns('캐시 파일에 쓸 수 없습니다. ');//trigger_error
return false;
}
flock($fso,LOCK_UN);//잠금 해제
fclose($fso)
return true;

function display_cache($cacheFile){
if(!file_exists($cacheFile)){
$this->warn('캐시 파일을 읽을 수 없습니다.');//trigger_error
return false;
}
echo '캐시 파일 읽기:'.$cacheFile;
//return unserialize(file_get_contents($cacheFile)); r');
$data = fread($fso, filesize($cacheFile));
fclose($fso)
return $data; ($cacheFile='default_cache.txt'){
$cacheFile = $this->cache_dir."/".$cacheFile
if(file_exists($ 캐시File)&&filemtime($cacheFile)>(time ()-$this->expireTime)){
$data=$this->display_cache($cacheFile);
}else{
$ data="여기서 mysql에서 가져올 수 있습니다. 데이터베이스, 업데이트 시간은 ".date('l dS of F Y h:i:s A').", 만료 시간은:" .date('l dS of F Y h:i :s A',time()+$this->expireTime)."----------"
$this->cache_page ($cacheFile,$data)
}
return $data;
}


}
?>


이 코드를 한 줄씩 설명하겠습니다. 🎜>3. 프로그램 분석

이 캐시 클래스(두려워할 것이 없습니다. 계속 읽어주세요)는 캐시라는 이름을 가지며 다음과 같은 2가지 속성을 갖습니다:


CODE:[복사 클립보드]private $cache_dir;
private $expireTime=180;
$cache_dir은 캐시된 파일이 있는 웹사이트 디렉터리에 상대적인 상위 디렉터리이며, $expireTime(참고 1)은 캐시된 데이터의 만료 시간입니다. , 주로 이 아이디어:
데이터나 파일이 로드되면 먼저 캐시 파일이 있는지 확인하고 false를 반환하며, 파일의 마지막 수정 시간과 캐시 시간의 합이 현재 시간보다 큰지 여부를 확인합니다. 크면 캐시가 만료되지 않았다는 뜻이고, 작으면 캐시 파일이 만료되지 않았다는 뜻이고, false가 반환되면 원본 데이터를 읽어 캐시 파일에 쓰고,

그런 다음 프로그램을 살펴보세요.


PHP:[클립보드에 복사]
function __construct($cache_dirname){
if(! @is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn( '캐시 파일이 존재하지 않아 생성할 수 없습니다. 캐시 파일을 만들어야 합니다. 수동으로 생성됨');
return false; 클래스가 처음으로 인스턴스화되면 파일 이름을 캐시하는 매개변수로 기본 함수가 생성됩니다. 파일이 존재하지 않는 경우 편집 권한이 있는 폴더를 생성하고 생성이 실패하면 예외를 발생시킵니다. 모든 캐시 파일은 이 폴더 이름에 있습니다.


PHP:[클립보드에 복사]
function __destruct( ){
echo 'Cache class bye .';
}



이것은 클래스 클래스의 소멸자입니다. 데모를 위해 캐시 클래스 리소스를 성공적으로 해제했음을 나타내는 문자열을 출력합니다. >
PHP:[클립보드에 복사]
function warning($errorstring){
echo " 발생 오류:
".$ errorstring."
";
}



이 메소드는


PHP:[클립보드에 복사]
function get_url() {
if (!isset($_SERVER['REQUEST_URI'])) {
$url = $ _SERVER['REQUEST_URI']
}else{
$url = $_SERVER['SCRIPT_NAME'];
$url .= (!empty($_SERVER['QUERY_STRING'])) '? : '';
}

return $url
}



이 메서드는 현재 URL의 정보를 반환합니다. 외국의 많은 사람들은 CMS 시스템에서 주로 x.php?page=1, x.php?page=2 및 기타 유사한 파일을 캐시합니다. 여기에 나열된 목적은 캐시 기능을 확장하는 것입니다. $this->warns('캐시 파일을 열 수 없습니다.');//trigger_error
return false
}
if(!flock($fso,LOCK_EX)){// LOCK_NB, 독점; lock
$this->warns('캐시 파일을 잠글 수 없습니다.');//trigger_error
return false;
}
if(!fwrite($fso,$ pagedata)){ //바이트 스트림 쓰기, 다른 형식 쓰기
$this->warns('캐시 파일을 쓸 수 없습니다.');//trigger_error
return false
}
flock($fso; ,LOCK_UN);//잠금 해제
fclose($fso);
return true;
}



cache_page 메소드가 별도로 전달됩니다. 캐시된 파일 이름과 데이터를 파일에 쓰는 방법입니다. 먼저 fopen을 사용하여 파일을 연 다음 핸들을 호출하여 파일을 잠근 다음 fwrite를 사용하여 파일을 쓰고 마지막으로 핸들을 해제합니다. 어떤 단계에서든 오류가 발생합니다.

Write to byte stream, serialize to write other format
그런데 배열을 만들고 싶다면 MySQL 데이터베이스에서 수행됩니다. 선택 쿼리(결과 제외)는 serialize 함수를 사용하여 작성되고 원본 유형은 unserialize를 사용하여 읽습니다.


PHP:[클립보드에 복사]
display_cache ($cacheFile){
if(!file_exists($cacheFile)){
$this->warn('캐시 파일을 읽을 수 없습니다.');//trigger_error
return false; }
echo '캐시 파일 읽기:'.$cacheFile
//return unserialize(file_get_contents($cacheFile))
$fso = fopen($cacheFile, 'r'); data = fread($fso, filesize($cacheFile));
fclose($fso);
return $data;



이 방법은 다음과 같습니다. 파일명으로 캐시를 읽는 방법은 파일을 직접 열어서 모두 읽어보세요. 파일이 존재하지 않거나 읽을 수 없다면 false를 반환하세요. 물론 비인간적이라고 느끼시면 캐시를 재생성하셔도 됩니다. 🎜>
함수 readData($cacheFile=' default_cache.txt'){
$cacheFile = $this->cache_dir."/".$cacheFile
if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
$data=$this->display_cache($cacheFile);
}else{
$data="여기서 mysql 데이터베이스에서 가져올 수 있습니다. 업데이트 시간은 ".date(' l dS of F Y h:i:s A').", 만료 시간은 다음과 같습니다:".date('l dS of F Y h:i:s A',time()+$this-> ;expireTime)."---------";
$this->cache_page($cacheFile,$data)
}
return $data; 🎜 >


이 함수는 우리가 호출하는 메서드입니다. 인터페이스 메서드로 작성할 수 있습니다. 들어오는 매개변수를 사용하여 파일의 마지막 수정 시간 + 만료 시간을 확인합니다. 현재 시간이 지났다면(만료되지 않았음을 나타냄), 파일이 존재하지 않거나 만료된 경우, 단순화를 위해 원본 데이터를 다시 로드하십시오. 특정 클래스로부터 캐시 클래스를 상속받아 데이터베이스에서 데이터를 가져올 수 있습니다. (참고 2)

4. 보충 설명 및 결론

참고 1: 캐시 시간은 직접 조정할 수 있습니다. 시간에 따라 배열, XML, 캐시 등을 읽을 수 있습니다. 캐시 시간(즉, 캐시된 키)도 캐시에 의해 제어된다는 점은 언급할 가치가 있습니다. 이는 CMS 시스템에서 널리 사용됩니다. . 전체 전투를 제어하기가 매우 쉬운 업데이트 키를 캐시에 넣었습니다.

참고 2: PHP5는 클래스 상속을 지원하기 시작합니다. 구성된 클래스를 만든 다음 데이터 계층과 상호 작용하는 클래스(예: MySQL과 상호 작용하는 클래스)를 작성합니다. 이 캐시 클래스는 데이터 상호 작용 클래스를 상속하고 데이터베이스를 매우 쉽게 읽을 수 있습니다. 여기서 자세히 논의할 시간이 있습니다.

특별히 이 클래스 파일은 PHP5 이상 버전용이므로 다른 버전의 클래스를 사용하지 마세요. PHP 중국어 웹사이트(www.php.cn)를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.