2010-02-19 60 views
5

我想利用一對夫婦的網頁緩存:PHP:頁面緩存與國家

  1. 個人博客網頁
  2. 的index.php

然而,制定我的系統後,我意識到我的頁面的標題會根據狀態輕微改變(也就是說,如果您已登錄,它會顯示「Hello,[email protected]」)。因此,我想確保它不會意外地將錯誤的用戶名或電子郵件顯示在最上面。

這是一個恥辱,這樣的,我想一個小東西不是頁面應該強迫我在我的網站緩存什麼都沒有上緩存。

我該如何解決這個問題?

回答

8

你會想想爲什麼你想要做緩存。緩存是一種優化,因此只能在必要時才能完成。

如果你不知道這是必要的,回去做一些研究,以確保。這將涉及測試實驗室生產級硬件的性能測試。

一旦你確定它是必要的,那麼你就會知道你有多大的改善需要。您可以考慮僅緩存頁面部分 - 與緩存整個頁面相比,前端和緩存層的緩存效率會低於緩存整理頁面,但可能會佔用更多的負載,因爲您將獲得更高的緩存命中率。

考慮一個網頁,其中有一個個性化的元素(比如,你好杜琪峯),並且是計算昂貴,但變化相對較少,是爲所有用戶相同的一部分 - 說,一些股票價格。

可以緩存頁面的(說)5分鐘股票價格的部分,並生成每次頁面的個性化的一部分。這樣你就不會在股票價格上受到影響,並且仍然可以向合適的人顯示正確的頁面。大多數公司發現生成前端代價相當昂貴(將HTML粘在一起很可惜相當費時)但是擴展性非常好 - 這意味着當速度不夠快時可以添加更多錫。另一方面,後端服務器可以做更多的工作,但規模要小得多 - 例如數據庫 - 您不能簡單地添加更多的服務器,因爲存在一致性/同步問題以應對哪些限制可伸縮性。

+0

+1如果您堅持要求頁面的某些部分是動態的,那麼您必須真正評估頁面的緩存片段是否值得付出。隨着片段緩存,你會增加你的能力有點,但你還是必須調用PHP解釋器爲每個頁面請求,從而限制了你遠遠低於你可以緩存整個頁面實現。 – 2010-02-19 22:04:09

4

我用了幾次,一種可能性是:

  • 生成頁面,並將其存儲到緩存中,包含類似的「Hello, %%PLACEHOLDER_NAME%%」,而不是真實姓名。
  • 當用戶加載頁面:
    • 負荷緩存頁面
    • (快速)str_replace用戶的名稱,以取代%%PLACEHOLDER_NAME%%標籤
    • 發送給您的「局部動態」頁面這種方式創造了。

這意味着你必須做一些PHP操作,而不能緩存整個頁面也不可事奉它作爲一個靜態文件...

...不過這也意味着幾乎整個頁面都將處於緩存中 - 例如,如果名稱存儲在會話中,則不必執行任何數據庫查詢。

(有人會說這是一個有點「髒」 - 但它的作品真的很好,只有一個或兩個必須是動態的,這似乎是這種情況,在您的情況小部分時)


如果你有一天開始有太多的佔位符,你必須考慮不緩存頁面,而是生成頁面所需的數據。

這意味着你必須來從緩存中的數據和部分粘在一起,產生的頁面 - 但是,這樣一來,你還是會避免SQL查詢的一些數字,因爲大部分數據將被載入來自緩存。

2

您可以使用用戶特定的參數,因爲在大多數高速緩存庫在那裏使用的cache_id或Cache_ID_Key:

例如:

$id = sh1($userMail); 
$cache->save($id); 

這是一個小例子。這個想法是「關鍵應該包括用戶特定的信息」,這是每個用戶所特有的。

希望你的想法。

+0

這可能會幫助我加載頁面的特定部分...不是一個壞主意 – johnnietheblack 2010-02-19 22:03:14

1

您正在使用哪種模板引擎? Smarty?如果是這樣,那麼你可以強制不緩存這樣的網頁的一些動態部分

{nocache} 
Hello {$username} This is your Email {$email} 
{/nocache} 
+0

其實我滾我自己還挺了解的膽量......不是一個壞主意,但。但聽起來相當複雜,可能收益甚微......對嗎? – johnnietheblack 2010-02-19 22:01:39

+1

Smarty並不複雜。它非常易於使用,並且非常好的記錄。我可以向大家推薦這還得需要分離aplication邏輯和設計邏輯 – streetparade 2010-02-19 22:04:04

1

你想要在哪裏緩存?

在您的服務器上?你可能想看看Smarty。

在代理服務器/客戶端?然後使html頁面可緩存,用空白div替換任何動態內容並使用javascript寫入值 - javascript可能會在cookie中緩存一些信息,然後返回到服務器。

;或者看看「而異:曲奇」頭爲如何使面向會話的緩存。

C.

+0

Smarty的是冷靜,我可以推薦給大家:-) – streetparade 2010-02-19 22:05:10

1

這是誠實很可能矯枉過正你想要的東西,但ESI地址你所面臨的問題。

但是,您也可以考慮這樣的:多麼流量的多少在登錄?對於許多網絡應用程序,90%以上的流量是匿名的,所有匿名頁面呈現相同。簡單地緩存匿名頁面可能會爲您帶來很多好處,而且根本沒有太多工作。

此外,考慮緩存可跨多個頁面中重用的頁面中的任何一小部分 - 例如,如果你有一個標籤雲,顯示在所有網頁上,並需要200毫秒,生成,緩存這些。

1

不緩存整個頁面 - 只是緩存需要實際的高速緩存(例如,將節省您打開一個數據庫連接的部分)的一部分。然後,頁面的其餘部分仍然可以是動態的,我會假設您將用戶名存儲在會話變量中,因此您仍然可以執行

echo "Hello ".$_SESSION['username'];