> 백엔드 개발 > PHP 튜토리얼 > PHP 데이터베이스 캐시 구현 아이디어

PHP 데이터베이스 캐시 구현 아이디어

不言
풀어 주다: 2023-03-28 19:08:01
원래의
4132명이 탐색했습니다.

이 글은 주로 참고할만한 가치가 있는 PHP 데이터베이스 캐싱 구현에 대한 아이디어를 소개합니다. 필요한 친구들이 참고할 수 있도록

SQL 쿼리 결과 캐싱

왜 해야 할까요? 쿼리 결과를 캐시하나요?

쿼리 결과를 캐싱하면 스크립트 실행 시간과 리소스 요구 사항을 크게 개선할 수 있습니다.

SQL 쿼리 결과를 캐싱하면 데이터를 사후 처리할 수도 있습니다. 파일 캐시를 사용하여 전체 스크립트의 출력(HTML 출력)을 저장하는 경우 작동하지 않을 수 있습니다. S SQL 쿼리를 실행할 때 주문 처리 과정은 다음과 같습니다.

& lt;-[if! SupportLists]-& gt l & lt;-[endif]-& gt; !--[if !supportLists]-->l ; SQL 쿼리 준비

l 데이터베이스에 쿼리 보내기

l                                                                                           --[if !supportLists]-->l                                                     ~   ,,                                                 ; 이는 대량의 반환 데이터를 얻는 두 가지 요소와 데이터베이스 서버의 위치를 ​​통해서만 조정될 수 있습니다. 지속적인 연결은 데이터베이스에 연결할 때 부하를 향상시킬 수 있지만, 많은 양의 데이터를 얻을 경우 전체 저장 시간이 매우 짧습니다.

SQL 쿼리 만들기:

SQL(Structured Query Language) 쿼리는 데이터베이스와 해당 내용을 조작하기 위한 인터페이스로 사용됩니다. SQL을 사용하여 테이블 구조를 정의 및 편집하고, 테이블에 데이터를 삽입하고, 테이블의 정보를 업데이트하거나 삭제할 수 있습니다.

SQL은 데이터와 통신하는 데 사용되는 언어입니다. 대부분의 PHP 데이터베이스 확장(MySQL, ODBC, Oracle 등)에서는 SQL 쿼리를 데이터베이스에 전달하여 전체 프로세스를 관리합니다.

이 튜토리얼에서는 선택한 언어만 데이터베이스의 데이터를 얻는 데 사용됩니다. 이 데이터는 캐시되어 나중에 데이터 소스로 사용됩니다.

캐시 업데이트 시기 결정:

캐싱은 프로그램의 필요에 따라 다양한 형태를 취할 수 있습니다. 가장 일반적인 3가지 방법은 다음과 같습니다.

l 콘텐츠 변경 트리거 캐시(데이터 변경 사항을 발견한 후 그에 따라 캐시가 업데이트됨)

l                                                                                           ->l                                                                             

l                                                                                                                         ]-& gt; l & lt;!-[endif]-& gt; 배열 직렬화

& lt;-[if! ; l & lt;-[endif]-& gt; 직렬화된 배열을 파일에 저장합니다

[php]

view plaincopy

$file = 'sql_cache.txt';  
$link = mysql_connect('localhost','username','password')  
    or die (mysql_error());  
mysql_select_db('shop')  
    or die (mysql_error());  
/* 构造SQL查询 */  
$query = "SELECT * FROM categories";  
$result = mysql_query($query)  
    or die (mysql_error());  
while ($record = mysql_fetch_array($result) )  
{  
    $records[] = $record;  
}  
$OUTPUT = serialize($records);  
$fp = fopen($file,"w"); // 以写权限的方式打开文件
fputs($fp, $OUTPUT);  
fclose($fp);
로그인 후 복사
sql_cache.txt 파일을 보면 내부 내용이 다음과 유사할 수 있습니다. a:1:{i:0;a:6: {i:0;s:1:"1";s:11:"category_id";s:1:"1";i:1;s:9: "컴퓨터";s:13:"category_name";s :9:

"컴퓨터" ;i:2;s:25:"컴퓨터에 대한 설명";s:20:"category_description"

;s:25: "컴퓨터에 대한 설명";}}

이 출력은 해당 변수 및 유형의 내부 표현입니다. mysql_fetch_array() 함수를 사용하여 숫자 인덱스 배열과 연관 배열(데이터가 두 번 발생하는 것처럼 보이는 이유)을 반환한다고 가정합니다. 하나는 숫자 인덱스이고 다른 하나는 문자열 인덱스입니다.

캐싱 사용:

캐싱을 사용하려면 unserialize() 함수를 사용하여 데이터를 원래 형식과 유형으로 복원해야 합니다. file_get_contents() 함수를 사용하여 sql_cache.txt 파일의 내용을 읽고 이를 변수에 할당할 수 있습니다.

참고: 이 기능은 PHP4.3.0 이상에서 유효합니다. 이전 버전의 PHP를 사용하는 경우 간단한 방법은 file() 함수를 사용하는 것입니다(전체 파일을 배열로 읽어 들이면 각 행이 배열이 됩니다). implode() 함수는 배열의 각 요소를 문자열로 연결한 다음 unserialize()를 사용하여 역직렬화하는 데 사용됩니다.

// file_get_contents() PHP < 4.3.0

[php]

view plaincopy

$file = &#39;sql_cache.txt&#39;;  
$records = unserialize(implode(&#39;&#39;,file($file)));  
//现在你可以通过$records数组并且取得原始查询的数据:  
foreach ($records as $id=>$row) {  
    print $row[&#39;category_name&#39;]."<br>";  
}
로그인 후 복사

에 적합합니다. $records는 배열(쿼리 결과를 포함하는 숫자 인덱스 열입니다. 각 행은 숫자이고 문자열 ... 정말 엉망입니다) 연속으로.

함께 배치:

이 예의 시간을 기준으로 캐시할지 여부를 결정하세요. 파일 수정 타임스탬프가 현재 타임스탬프에서 만료 타임스탬프를 뺀 것보다 크면 캐시가 사용되고, 그렇지 않으면 캐시가 업데이트됩니다. <--[if !supportLists]-->l                                                                              | [php]

일반 사본 보기

$file = &#39;sql_cache.txt&#39;;  
$expire = 86400; // 24 小时 (单位:秒)
if (file_exists($file) &&   
filemtime($file) > (time() - $expire))  
{  
    // 取得缓存中的记录  
    $records = unserialize(file_get_contents($file));  
} else {  
    // 通过 serialize() 函数创建缓存  
}
로그인 후 복사

추가 다른 가능성:

l                                                      -[if !supportLists]-->l                                        > > 일치하지 않는 경우 캐시를 업데이트합니다(이 기능이 실행될 확률은 1/100으로 설정 가능). 해시 알고리즘(예: MD5())은 문자열이나 파일이 변경되었는지 확인하는 데 도움이 될 수 있습니다.

l                                                                                                                     () 함수는 false를 반환합니다). unlink() 함수를 사용하여 파일을 삭제할 수 있습니다.

스크립트:

[php]

일반 복사 보기

$file = &#39;sql_cache.txt&#39;;  
$expire = 86400; // 24 小时
if (file_exists($file) &&  
    filemtime($file) > (time() - $expire)) {  
    $records = unserialize(file_get_contents($file));  
} else {  
    $link = mysql_connect(&#39;localhost&#39;,&#39;username&#39;,&#39;password&#39;)  
        or die (mysql_error());  
    mysql_select_db(&#39;shop&#39;)  
        or die (mysql_error());  
    /* 构造SQL查询 */  
    $query = "SELECT * FROM categories";  
    $result = mysql_query($query)  
        or die (mysql_error());  
    while ($record = mysql_fetch_array($result) ) {  
        $records[] = $record;  
    }  
    $OUTPUT = serialize($records);  
    $fp = fopen($file,"w");  
    fputs($fp, $OUTPUT);  
    fclose($fp);  
} // end else  
   
// 查询结果在数组 $records 中  
foreach ($records as $id=>$row) {  
    if ($row[&#39;category_id&#39;] == $_REQUEST[&#39;category_id&#39;]) {  
        // 被选择的目录显示粗体字  
        print &#39;<B>&#39;.$row[&#39;category_name&#39;].&#39;</B><BR>&#39;;  
    } else {  
        // 其它目录显示用常规字体  
        print $row[&#39;category_name&#39;].&#39;<br>&#39;;  
    }  
} // end foreach
로그인 후 복사

위 내용은 PHP 데이터베이스 캐시 구현 아이디어의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿