2011-05-16 47 views
10

我在CakePHP中找到的一個很好的功能是能夠設置一個「flash」消息,比如說一些「保存」腳本,然後在下一頁顯示該消息。類似於「發佈更新」或「錯誤 - 找不到文件」。基於Cookie和基於會話的Flash消息

Cake做這件事的方式是用這個「session」對象。我試圖避免像瘟疫這樣的會議,因爲它們對可擴展性有着奇怪的要求。我能不能簡單地將Flash消息存儲在cookie(客戶端)中,然後在該cookie顯示在下一頁後刪除該cookie?這種方法會有什麼優點/缺點 - 或者更簡單地說,爲什麼Cake會使用「會話」(我假設它涉及_SESSION集合)。

乾杯!

p.s.在我的實現中,我還通過javascript中的「setTimeout」命令使其淡出。我發現這是結束整個過程的好方法。

+0

「我試圖避免會議像瘟疫,因爲他們奇怪的要求scal能力」。你能詳細說明嗎? – 2011-05-16 18:20:19

+0

是的,當將Web服務器水平擴展到服務器場中時,您無法保證相同的服務器在同一個請求中被擊中 - 因此它可能正在服務器A上處理,生成會話Flash消息,然後在隨後的重定向中顯示來自服務器B不知道其他服務器的會話。有解決這個問題的辦法,但它們不是最優的IMO(即粘性會話等)。 – MikeMurko 2011-05-16 19:23:10

+0

@MileMurko大多數HA應用程序實現的特定問題的解決方案是將會話保存處理程序切換爲使用數據庫或分佈式緩存解決方案(如memcache)。這使會話數據可以從任何網站頭獲得。如果你的問題是'哪個更好',那麼你需要詳細解釋爲什麼你不會固有地選擇一種解決方案。 – 2011-05-16 19:28:15

回答

4

Cookie存在的問題是用戶可能會禁用此功能。如果是這樣,您的Flash消息將不會顯示。 CakePHP嘗試足夠通用並使用會話存儲。

你有3種選擇:

  1. 會議:最常用的方法。它可以在任何客戶端計算機上工作,但如您所說,它可能會給某些服務器配置帶來問題。
  2. Cookies:這是一個很好的選擇,但用戶可能會阻止這種機制。只有當您的應用程序需求包含cookies需求時纔可以推薦。
  3. 數據庫:通用的解決方案。問題在於它需要訪問數據庫(很慢)。一個ID應該通過URL傳遞(GET方法),這樣應用程序就知道哪個數據庫寄存器對應這個訪問。

在我的應用我用的是第二和第三方法的組合:我測試餅乾,如果可用,我使用它們。如果沒有,我使用數據庫訪問,但我總是緩存數據庫訪問,以便不會多次查詢每條消息。

+5

如果cookies被禁用,會話真的會起作用嗎?會話是否依賴於Cookie? (如果您尚未啓用PHPSESSID) – Znarkus 2011-05-23 11:14:30

+1

但是,您將如何將會話從一個事務持續到下一個事務?會話存儲是服務器端,但是會話標識符必須提供給客戶端,以便在下一次POST/GET調用時返回。 – David 2011-05-25 17:07:01

+3

正如@David所說,服務器通過在計算機上存儲cookie來識別多個請求中的用戶。 – Znarkus 2011-05-26 11:25:08

4

我不明白爲什麼你不能使用從創建日期10分鐘到期的cookie。如果用戶離開並在11分鐘內回來,他們可能不會看到Flash cookie消息,但是您不必擔心用客戶端Cookie溢出。

只要制定一些簡單的內容規則,以確保沒有特權信息被放入一個Flash消息,你應該是好的。

一個簡單的實現可能是什麼樣的程序:

function setFlash($id ,$message){ 
    setcookie("flash_{$id}", $message, time() + 60 * 10); 
} 


function getFlashes(){ 
    $flashes = array(); 
    foreach($_COOKIE as $id => $value){ 
     if(strpos($id, "flash_") === 0){ 
      $flashes[$id] = $value; 
      //clear flash and set expiration to 10 minutes in past 
      setcookie($id, "", time() * 60 * -10); 

     } 
    } 
    return $flashes; 
    //Input cleansing not included for brevity/clarity 
} 

或者,如果閃光燈負全部從客戶端發起,你可以使用像https://github.com/marcuswestin/store.js嘗試使用localSession商店管理提示信息。

0

另一個想法是消息通過散列在URL中的運輸:

if (isset($_POST['submit'])) { 
    ... 
    header("Location: ".$_SERVER["REQUEST_URI"]."#".urlencode($msg)); 
    ... 
} 

優點:

  • 是否沒有Cookie /會話/數據庫/ memcaches等工作:-)
  • 不依賴於客戶端時鐘餅乾做
  • 沒有其他客戶端請求可以「偷」的消息

缺點:

相關問題