2008-10-01 185 views
5

我想實現一個雙通道緩存系統兩遍PHP緩存系統:創建具有可變項

  • 第一遍生成一個PHP文件,所有的共同的東西(如新聞條目),硬編碼。數據庫然後有一個緩存表來鏈接這些頁面(例如「index.php page = 1 style = default」),數據庫也存儲一個uptodate字段,如果爲false則導致第一遍在下次頁面時重新運行被觀看。

  • 第二次通過填充次要的細節,比如多久之前有東西(?),以及諸如「您已登錄爲...」等可變項目。

但是我不知道在一個有效的實施,同時支持緩存和非緩存(例如,搜索)的網頁,而無需大量的代碼和幾個查詢。

現在每次頁面加載時,都會運行PHP腳本來重新生成頁面。對於像搜索這樣的頁面來說,這很好,因爲大多數搜索都是不同的,但對於其他頁面(例如索引),這對每個匹配實際上都是相同的,但會生成大量查詢並且是相當長的腳本。

問題是頁面的某些部分在每個用戶的基礎上進行更改,例如「您以...登錄」部分,因此只保存生成的頁面仍然會導致10,000個幾乎相同的頁面。

主要關注的是減少服務器上的負載,因爲我在共享主機上,並且此時無法升級,但該站點正在使用服務器的相當大一部分CPU +將一個公平的加載MySQL服務器。

因此,基本上最小化每個頁面請求需要完成多少工作,而不是像索引上的新聞項目那樣重新生成索引似乎是一個好的開始,相比之下,搜索是一個不太靜態的頁面。

我實際上認爲硬編碼的新聞項目是純HTML,但這意味着要在幾個地方維護它們(因爲它們可能用於搜索,並且註釋在專用於該新聞項目的頁面上(即news.php )等)。

回答

6

我第二次肯介紹了PEAR的Cache_Lite庫,你可以用它來輕鬆地緩存頁面的一部分或整個頁面。

如果您正在運行自己的服務器,則強烈建議使用memcached。由於它完全在內存中運行並且被大量大量網站廣泛使用,因此速度更快。這是一個非常簡單,穩定,無故障的守護進程。在你的PHP代碼方面,你會用它的用法與Cache_Lite一樣,緩存各個頁面的部分或整頁(或數據的其他任意的斑點),這是非常容易使用,因爲PHP有​​memcache interface built in

對於超高流量的整頁緩存,請看VarnishSquid作爲緩存逆向代理服務器。 (由Varnish提供的頁面將比任何碰到PHP解釋器的頁面快100倍)。

記住緩存,你只需要緩存經常訪問的東西。有時候,如果你真的不需要它,它可能會成爲一個非常複雜的緩存策略的陷阱。對於像您的主頁這樣的頁面,每秒會出現幾次,您肯定希望優化它的速度;對於一個小時可能出現幾次點擊的頁面,比如一個月前的博客文章,緩存它是一個壞主意,你只會浪費你的時間,讓事情變得更加複雜和容易出錯。

1

你想將結果保存到這樣的文件,並使用邏輯來拉他們回來了:

if filename exists 
    include filename 
else 
    generate results 
    render to html (as string) 
    write to file 
    output string or include file 
endif 

需要明確的是,你並不需要兩遍,因爲你可以保存網頁的部分並保持其餘的動態。

3

對於服務器端緩存使用類似Cache_Lite(並讓有關文件鎖定,到期日期,文件損壞別人的擔心)

4

我建議不要重新發明輪子...有一些模板引擎,支持緩存,就像Smarty

+0

我看不出這個fullfills我的任何需求,因爲高速緩存中的,似乎是一生的定義,這對我的網站和B-doesn't允許常用更換部件(例如:用戶名不相關)針對每個請求進行更新,而無需重新構建整個頁面... – 2008-10-04 18:04:34

0

我會建議使用現有的緩存機制。根據你真正需要的東西,你可能正在尋找APC,memcached,各種模板緩存庫......更容易/更快地調整書面/測試代碼以滿足你的需求,而不是從頭開始寫所有東西。 (通常,儘管可能存在的情況下,當你沒有choisce)

1

像往常一樣與這種類型的問題,我的回答是:

  • 爲什麼需要緩存?
  • 你的應用程序在你的數據庫上消耗了太多的IO嗎?
  • 你跑什麼指標?

您正在討論的是爲您的應用程序添加額外的複雜程度,因此您需要非常確定您確實需要它。

你可能會從實際使用內置的MySQL查詢緩存中受益,如果數據庫系統中的爭點。另一個選項也是使用Memcache。