Home php教程 php手册 PHP缓存技术详谈

PHP缓存技术详谈

May 25, 2016 pm 04:53 PM
php technology cache

一、引论

PHP,一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站,在速度上有绝对的优势,想mssql转6万条数据php如需要40秒,asp不下2分钟.但是,由于网站的数据越来越多,我们渴求能更快速的调用数据,不必要每次都从数据库掉,我们可以从其他的地方,比方一个文件,或者某个内存地址,这就是php的缓存技术,也就是Cache技术.

二、分析深入

一般来说,缓存的目的是把数据放在一个地方让访问的更快点,毫无疑问,内存是最快的,但是,几百M的数据能往内存放么?这不现实,当然,有的时候临时放如服务器缓存,如ob_start()这个缓存页面开启的话在发送文件头之前页面内容都被缓存在内存中,知道等页面输出自动清楚或者等待ob_get_contents的返回,或者被ob_end_clean显示的清除,这在静态页面的生成中能很好的利用,在模板中能得到很好的体现,我的这篇文章深入的讨论了:谈PHP生成静态页面,这是一种方式,但这是临时性的,不是解决我们问题的好方法.

另外,在asp中有一对象application,可以保存公用的参数,这也算点缓存,但在php,我至今没看到开发者产出这种对象,的确,没必要.asp.net的页面缓存技术就用的是viewstate,而cache就是文件关联,(不一定准确),文件被修改,更新缓存,文件没被修改而且不超时(注释1),就读取缓存,返回结果,就是这个思路,看看这个源码:

<?php
class cache {
    /*
    Class Name: cache
    Description: control to cache data,$cache_out_time is a array to save cache date time out.
    Version: 1.0
    Author: 老农 cjjer
    Last modify:2006-2-26
    Author 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(&#39;缓存文件不存在而且不能创建,需要手动创建.&#39;);
                return false;
            }
        }
        $this->cache_dir = $cache_dirname;
    }
    function __destruct() {
        echo &#39;Cache class bye.&#39;;
    }
    function get_url() {
        if (!isset($_SERVER[&#39;REQUEST_URI&#39;])) {
            $url = $_SERVER[&#39;REQUEST_URI&#39;];
        } else {
            $url = $_SERVER[&#39;SCRIPT_NAME&#39;];
            $url.= (!empty($_SERVER[&#39;QUERY_STRING&#39;])) ? &#39;?&#39; . $_SERVER[&#39;QUERY_STRING&#39;] : &#39;&#39;;
        }
        return $url;
    }
    function warn($errorstring) {
        echo "<b><font color=&#39;red&#39;>发生错误:<pre class="brush:php;toolbar:false">" . $errorstring . "
Copy after login
"; } function cache_page($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)) { //写入字节流,serialize写入其他格式 $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)); $fso = fopen($cacheFile, 'r'); $data = fread($fso, filesize($cacheFile)); fclose($fso); return $data; } function 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 = "from here wo can get it from mysql database,update time is " . 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; } } ?>

下面我打断这个代码逐行解释.

三、程序透析

这个缓存类(类没什么好怕的.请继续看)名称是cache,有2个属性:

private $cache_dir;

private $expireTime=180;

$cache_dir是缓存文件所放的相对网站目录的父目录, $expireTime(注释一)是我们缓存的数据过期的时间,主要是这个思路:

当数据或者文件被加载的时候,先判断缓存文件存在不,返回false ,文件最后修改时间和缓存的时间和比当前时间大不,大的话说明缓存还没到期,小的话返回false,当返回false的时候,读取原始数据,写入缓存文件中,返回数据.

接着看程序:

<?php
function __construct($cache_dirname) {
    if (!@is_dir($cache_dirname)) {
        if (!@mkdir($cache_dirname, 0777)) {
            $this->warn(&#39;缓存文件不存在而且不能创建,需要手动创建.&#39;);
            return false;
        }
    }
    $this->cache_dir = $cache_dirname;
}
?>
Copy after login

当类第一次被实例的时候构造默认函数带参数缓存文件名称,如文件不存在,创建一个有编辑权限的文件夹,创建失败的时候抛出异常.然后把cache类的 $cache_dir属性设置为这个文件夹名称,我们的所有缓存文件都是在这个文件夹下面的.

<?php
function __destruct() {
    echo &#39;Cache class bye.&#39;;
}
?>
Copy after login

这是class类的析构函数,为了演示,我们输出一个字符串表示我们释放cache类资源成功.

function warn($errorstring){

echo "发生错误:

".$errorstring."
Copy after login
";

}

这个方法输出错误信息.

<?php
function get_url() {
    if (!isset($_SERVER[&#39;REQUEST_URI&#39;])) {
        $url = $_SERVER[&#39;REQUEST_URI&#39;];
    } else {
        $url = $_SERVER[&#39;SCRIPT_NAME&#39;];
        $url.= (!empty($_SERVER[&#39;QUERY_STRING&#39;])) ? &#39;?&#39; . $_SERVER[&#39;QUERY_STRING&#39;] : &#39;&#39;;
    }
    return $url;
}
?>
Copy after login

这个方法返回当前url的信息,这是我看国外很多人的cms系统这样做,主要是缓存x.php?page=1,x.php?page=2,等这种文件的,这里列出是为了扩展的这个cache类功能的.

<?php
function cache_page($pageurl, $pagedata) {
    if (!$fso = fopen($pageurl, &#39;w&#39;)) {
        $this->warns(&#39;无法打开缓存文件.&#39;); //trigger_error
        return false;
    }
    if (!flock($fso, LOCK_EX)) { //LOCK_NB,排它型锁定
        $this->warns(&#39;无法锁定缓存文件.&#39;); //trigger_error
        return false;
    }
    if (!fwrite($fso, $pagedata)) { //写入字节流,serialize写入其他格式
        $this->warns(&#39;无法写入缓存文件.&#39;); //trigger_error
        return false;
    }
    flock($fso, LOCK_UN); //释放锁定
    fclose($fso);
    return true;
}
?>
Copy after login

cache_page方法分别传入的是缓存的文件名称和数据,这是把数据写到文件里的方法,先用fopen打开文件,然后调用句柄锁定这个文件,然后用fwrite写入文件,最后释放这个句柄,任何一步发生错误将抛出错误. 您可能看到这个注释:

写入字节流,serialize写入其他格式

顺便一提的是如果我们要把一个数组,(可以从MySQL数据库里面select查询除了的结果)用serialize函数写入,用unserialize读取到原来的类型.

<?php
function display_cache($cacheFile) {
    if (!file_exists($cacheFile)) {
        $this->warn(&#39;无法读取缓存文件.&#39;); //trigger_error
        return false;
    }
    echo &#39;读取缓存文件:&#39; . $cacheFile;
    //return unserialize(file_get_contents($cacheFile));
    $fso = fopen($cacheFile, &#39;r&#39;);
    $data = fread($fso, filesize($cacheFile));
    fclose($fso);
    return $data;
?>}
这是由文件名称读取缓存的方法,直接打开文件,读取全部,如果文件不存在的或者无法读取的话返回false,当然,你感到不人性的话,可以重新生成缓存.
<?php
    function readData($cacheFile = &#39;default_cache.txt&#39;) {
        $cacheFile = $this->cache_dir . "/" . $cacheFile;
        if (file_exists($cacheFile) && filemtime($cacheFile) > (time() - $this->expireTime)) {
            $data = $this->display_cache($cacheFile);
        } else {
            $data = "from here wo can get it from mysql database,update time is <b>" . date(&#39;l dS \of F Y h:i:s A&#39;) . "</b>,过期时间是:" . date(&#39;l dS \of F Y h:i:s A&#39;, time() + $this->expireTime) . "----------";
            $this->cache_page($cacheFile, $data);
        }
        return $data;
    }
?>
Copy after login

这个函数是我们调用的方法,可以写成接口的方法,由传入参数判断文件存在不,文件最后修改时间+expireTime的时间是不是过了当前时间(大于的话说明没有过期),如果文件不存在或者已经过期,重新加载原始数据,这里,为了简单期间,我们是直接源是字符串,您可以把cache类继承某类,取到数据库的数据.(注释2)

四、补充说明,结语

注释一:这个缓存的时间您可以自己调,可以根据时间情况读取数组,xml,缓存等,请按照您的方便,值得一提的是缓存的时间(也就是缓存的key)也用缓存控制,.这在cms系统中被广泛使用,他们把要更新的key放在缓存中,非常容易控制全战.

注释二:php5开始支持类继承,这是让人兴奋的,把网站全局休息写在一个配置的类里面,再写与数据层交互的类(如与MySQL交互的类),我们的这个cache类继承数据交互的类,可以非常容易的读取数据库,这是外话,此处不再展开,有时间和大家详谈.

特别说明,这个类文件针对的php5以上版本,其他版本的请不要使用类.


文章网址:

随意转载^^但请附上教程地址。

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

Discuss CakePHP Discuss CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP is an open-source framework for PHP. It is intended to make developing, deploying and maintaining applications much easier. CakePHP is based on a MVC-like architecture that is both powerful and easy to grasp. Models, Views, and Controllers gu

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

CakePHP Quick Guide CakePHP Quick Guide Sep 10, 2024 pm 05:27 PM

CakePHP is an open source MVC framework. It makes developing, deploying and maintaining applications much easier. CakePHP has a number of libraries to reduce the overload of most common tasks.

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

See all articles