首頁  >  文章  >  後端開發  >  php中關於9大快取技術總結的講解

php中關於9大快取技術總結的講解

黄舟
黄舟原創
2017-08-13 09:11:201258瀏覽

1、全頁面靜態化快取

也就是將頁面全部產生html靜態頁面,使用者造訪時直接造訪的靜態頁面,而不會去走php伺服器解析的流程。此種方式,在CMS系統中比較常見,例如dedecms;

一種比較常用的實作方式是用輸出快取:

Ob_start()
******要运行的代码*******
$content = Ob_get_contents();
****将缓存内容写入html文件*****
Ob_end_clean();

2、頁面部分快取

該種方式,是將一個頁面中不常變的部分進行靜態緩存,而經常變化的塊不緩存,最後組裝在一起顯示;可以使用類似於ob_get_contents 的方式實現,也可以利用類似ESI之類的頁面片段快取策略,使其用來做動態頁面中相對靜態的片段部分的快取

任何一個Web網站的內容都是在不斷更新和變化,但這並不意味著這這個網站的內容就是動態內容,事實上,動態的內容是指用戶每次點擊相同的連結時取的的內容是由Web伺服器應用程式產生的,如常見得ASP,JSP等,與此相對應,靜態內容一般是指由文字、圖像和多媒體組成,在使用者每次點選對應連結時基本上保持不變。現在解決動態內容快取的最新技術就是透過ESI技術設計網站的內容。

    ESI技術運作原理

    動態產生的內容能為使用者帶來豐富精彩的頁面,網站開發者也可以更容易和更靈活地控制相關的內容,但在享受這些便利的同時,也增加了網站資料庫和應用程式伺服器的處理壓力的。當網站的訪問量增加後,硬體和資料庫的投資是非常巨大的,即使如此,仍然有可能導致頁面的嚴重延遲甚至訪問失敗。

    使用者存取動態產生的內容速度慢的根本原因在於動態產生的內容需要經過一個複雜的過程,首先,根據使用者請求的不同將使用者的請求分配到應用程式伺服器在對應的軟體模組中,軟體模組必須透過運算決定需要從資料庫中提取什麼樣的資料給用戶,然後再從資料庫中提取出對應的資料依照定義的格式傳給用戶。這些冗長的過程導致用戶存取速度變慢,同時增加了伺服器的負載。

    在實際環境中,一個動態產生的頁面,當中可能只有少量的內容是頻繁變化的或是個人化的,對於傳統的Cache伺服器來說,為了能夠保證頁面的時效性,卻由於頁面中這些少量的動態內容而無法將整個頁面進行快取。 ESI(Edge Side Include)透過使用簡單的標記語言來對那些可以加速和不能加速的網頁中的內容片段進行描述,每個網頁都被劃分成不同的小部分分別賦予不同的快取控制策略,使Cache伺服器可以根據這些策略在將完整的網頁發送給用戶之前將不同的小部分動態地組合在一起。透過這種控制,可以有效地減少從伺服器抓取整個 頁面的次數,而只用從原始伺服器中提取少量的不能快取的片斷,因此可以有效降低原始伺服器的負載,同時提高使用者存取的回應時間。

    ESI是一種簡單的識別語言,開發人員可以使用它來標誌內容片段以便透過對應的Cache伺服器來加速快取。同時ESI也定義了一 套內容效驗標準,可以實現原始伺服器對Cache伺服器中快取內容的管理,並提升了網站對內容的控制能力。 CDN網路也可以利用在分佈全國各地的節點中安裝支 持ESI的Cache伺服器來提供對網站動態內容提供CDN服務。

該種方式可以用在如商城中的商品頁;

#3、資料快取

顧名思義,就是快取資料的一種方式;例如,商城中的某個商品信息,當用商品id去請求時,就會得出包括店鋪信息、商品信息等數據,此時就可以將這些數據緩存到一個php文件中,文件名包含商品id來建一個唯一標示;下次有人想查看這個商品時,首先就直接調這個文件裡面的信息,而不用再去數據庫查詢;其實緩存文件中緩存的就是一個php數組之類;

Ecmall商城系統裡面就用了這種方式;

4、查詢快取

其实这跟数据缓存是一个思路,就是根据查询语句来缓存;将查询得到的数据缓存在一个文件中,下次遇到相同的查询时,就直接先从这个文件里面调数据,不会再去查数据库;但此处的缓存文件名可能就需要以查询语句为基点来建立唯一标示;

按时间变更进行缓存

其实,这一条不是真正的缓存方式;上面的2、3、4的缓存技术一般都用到了时间变更判断;就是对于缓存文件您需要设一个有效时间,在这个有效时间 内,相同的访问才会先取缓存文件的内容,但是超过设定的缓存时间,就需要重新从数据库中获取数据,并生产最新的缓存文件;比如,我将我们商城的首页就是设 置2个小时更新一次;

5、按内容变更进行缓存

这个也并非独立的缓存技术,需结合着用;就是当数据库内容被修改时,即刻更新缓存文件;

比如,一个人流量很大的商城,商品很多,商品表必然比较大,这表的压力也比较重;我们就可以对商品显示页进行页面缓存;

当商家在后台修改这个商品的信息时,点击保存,我们同时就更新缓存文件;那么,买家访问这个商品信息时,实际上访问的是一个静态页面,而不需要再去访问数据库;

试想,如果对商品页不缓存,那么每次访问一个商品就要去数据库查一次,如果有10万人在线浏览商品,那服务器压力就大了;

6、内存式缓存

提到这个,可能大家想到的首先就是Memcached;memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。

它就是将需要缓存的信息,缓存到系统内存中,需要获取信息时,直接到内存中取;比较常用的方式就是 key–>value方式;

<?php 
     $memcachehost = &#39;192.168.6.191&#39;;
     $memcacheport = 11211;
     $memcachelife = 60;
     $memcache = new Memcache;
     $memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
     $memcache->set(&#39;key&#39;,&#39;缓存的内容&#39;);
     $get = $memcache->get($key);       //获取信息
?>

7、apache缓存模块

apache安装完以后,是不允许被cache的。如果外接了cache或squid服务器要求进行web加速的话,就需要在htttpd.conf里进行设置,当然前提是在安装apache的时候要激活mod_cache的模块。

安装apache时:./configure –enable-cache –enable-disk-cache –enable-mem-cache

8、php APC缓存扩展

Php有一个APC缓存扩展,windows下面为php_apc.dll,需要先加载这个模块,然后是在php.ini里面进行配置:

[apc] 
     extension=php_apc.dll 
     apc.rfc1867 = on 
     upload_max_filesize = 100M 
     post_max_size = 100M 
     apc.max_file_size = 200M 
     upload_max_filesize = 1000M 
     post_max_size = 1000M 
     max_execution_time = 600 ;   每个PHP页面运行的最大时间值(秒),默认30秒 
     max_input_time = 600 ;       每个PHP页面接收数据所需的最大时间,默认60 
     memory_limit = 128M ;       每个PHP页面所吃掉的最大内存,默认8M

9、Opcode缓存

我们知道,php的执行流程可以用下图来展示:

首先php代码被解析为Tokens,然后再编译为Opcode码,最后执行Opcode码,返回结果;所以,对于相同的php文件,第一次运行时 可以缓存其Opcode码,下次再执行这个页面时,直接会去找到缓存下的opcode码,直接执行最后一步,而不再需要中间的步骤了。

比较知名的是XCache、Turck MM Cache、PHP Accelerator等。

以上是php中關於9大快取技術總結的講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn