2011-03-30 73 views
0

以下是PHP中基於驅動程序的緩存類的簡單開始。另一位用戶提交它...將PHP會話和cookie作爲緩存選項是不好的?

<?php 
class Cache 
{ 
    protected $Driver; 
    public function __construct($driver) 
    { 
     require_once 'drivers/' . $drivers . '.driver.php'; 
     $driver = "Cache_Driver_" . $driver; 

     $this->Driver = new $driver; 
    } 


    public function create($key,$value) 
    { 
     return $this->Driver->create($key,$value); 
    } 

    public function read($key,$value) 
    { 
     return $this->Driver->read($key,$value); 
    } 

    public function update($key,$value) 
    { 
     return $this->Driver->update($key,$value); 
    } 

    public function remove($key) 
    { 
     return $this->Driver->remove($key); 
    } 
} 

?> 

我的計劃是有單獨的類「文件/驅動器」用於緩存的每個方法我將在我的應用程序。到目前爲止,我打算使用,

- 文件
- APC
- 的Memcache或Memcached的
- Redis的
- 會話
- 餅乾

所以我的主要問題(#1)在這裏,我意識到會話和cookie通常不被認爲是緩存的一部分,但我認爲他們會適合在這裏,而不是真正「緩存」大量數據,但更多的是作爲獲取/設置會話和cookie的方式s,而不是具有特定的會話和cookie類,他們會利用我的get/set/unset方法從這個類。

請告訴我你對這個想法的看法?好,壞,任何暗示?謝謝!

問題(#2) n對於我的課,這將成爲會議上,我就在想,我在構造函數中的會話Driver類,我可以打電話給

session_start()

那裏。可能的問題是,這不是要求我立即使用會話驅動程序啓動緩存,就像在我的應用程序的頂部調用其他任何內容之前一樣?或者更糟的是,在我的應用程序的頂部,必須在類本身之外調用session_start()?再次尋找suggetions,我覺得我忽略了一些東西,再次感謝任何幫助。

<?php 
$cache = new Cache('Session'); 
?> 
+1

會話和cookie最明顯的問題是無法使緩存條目無效。 – zerkms 2011-03-30 00:44:12

+0

會議也不是很耐用。默認情況下,會話至少每小時清除一次。此外,像googlebot這樣的抓取工具會爲他們請求的每一個頁面生成一個新的會話。如果您的應用程序擁有多個Web前端,則必須處理將會話移動到共享存儲,或基於會話進行負載平衡。 – 2011-03-30 01:06:23

回答

2

我認識到,會話和Cookie通常不認爲是緩存的一部分,但我認爲他們會適合這裏,而不是真正的「緩存」大量的數據,但更多的方式來獲得/設置我的會話和cookie,而不是有特定的會話和cookie類,他們會利用我的get/set/unset方法從這個類。

PHP有完美的方法來處理cookie和會話。他們被稱爲$_COOKIE/setcookie$_SESSION。即使界面在表面上是足夠的,您也不需要爲其他目的設計的包裝。例如,Cookie有額外的東西,你擔心,如域名和到期時間,而會議不會。也許您的緩存數據將過期,但您將如何管理會話中的過期信息?

如果你想包裝它們,包裝它們,但不要他們到一個爲另一個目的而設計的界面。

這不需要我馬上用會話驅動程序啓動緩存,就像在我的應用程序的頂部調用其他任何內容之前一樣?

不一定。 session_id()會話尚未啓動時返回空字符串,至少在交互式提示符處。您可以使用它來檢測是否需要啓動會話。

1

PHP已經支持管理會話的不同後端。不要創建自己的包裝,PHP會話已經是一個包裝。您可以將PHP配置爲使用文件(默認),mysql,memcache或許多其他方法。

+0

他詢問了一般的緩存層,而不是會話存儲。 – zerkms 2011-03-30 00:57:14

3

餅乾

有在cookie中的一些限制的數據存儲將會使他們理想的緩存解決方案,可能不值得努力少:

  • Cookies是每個域的數量和大小都有限制。例如,in IE,每個cookie限制爲4kb,每個域最多可以有20個cookie。
  • Cookie隨每個請求都發送到服務器。如果您要將80kb的數據存儲在cookie中,這會使每個請求(包括針對同一主機上的非動態資源的請求)非常大。
  • Cookies是每用戶(見下文)在$_SESSION

$_SESSION

緩存的數據更合理的,因爲在後面的往復通信的唯一增加的是單一的小會議-id Cookie標頭。在$_SESSION陣列中緩存的一大缺點是會話數據對於每個客戶端是分開的。通過其他緩存後端(APC,Memcache等),數據可以共享並可用於來自每個客戶端的請求。這引發的問題是,對於每客戶端會話緩存,沒有簡單的方法來清除或更新來自其他客戶端會話數據的值,從而導致過時的緩存。

結論

雖然每個客戶端的緩存是合理的東西一般,在他們和其他共享存儲高速緩存之間的操作模式的差異後端你提到(APC,內存緩存,等等),這意味着許多預計共享存儲高速緩存的應用程序在向每個客戶端提供高速緩存時可能會中斷。兩種類型的緩存都有自己的位置,但混淆了正在使用的類型可能是問題的解決辦法。

就個人而言,我會跳過會話數據和cookie作爲緩存後端,除非您專門構建每客戶端緩存系統。在這種情況下,我會跳過Cookie並實施會話存儲。