2009-08-04 19 views
6

我讀過以前的關於PHP緩存的解答,以及他們鏈接到的文章。我已經檢查了經常推薦的Pear Cache_Light,QuickCache和WordPress超級緩存。 (對不起 - 我被允許超鏈接一次。)PHP中處理併發性的頁面緩存?

要麼沒有處理併發問題,要麼沒有明確地聲明他們在他們的文檔中做。

任何人都可以指向處理併發性的PHP頁面緩存的方向嗎?

這是在一個共享的主機上,所以memcache和操作碼緩存不幸是不可選的。我不使用模板引擎,並且希望避免依賴某個引擎。 WP超級緩存的方法是可取的 - 即將靜態文件存儲在wwwroot下讓Apache爲其提供服務 - 但這不是必需條件。

謝謝!

P.S.應該自動處理的東西的示例:

  1. Apache/PHP緩存正在讀取緩存文件。緩存的文件變得過時並嘗試刪除。
  2. 緩存文件被刪除,因爲它已過時。該文件的請求進入,並且該文件正在被重新創建。 另一個在此期間請求文件。

回答

0
  1. 在Linux下,通常,該文件將仍然是讀「開放」,即使它的「刪除」,直到進程關閉文件。這是內置到系統中的東西,有時會導致磁盤使用大小的巨大差異(刪除3G文件仍然「打開」意味着仍然在磁盤上分配,直到過程關閉爲止)我不確定在linux下是否也是如此。
  2. 假設日誌文件系統(大多數Linux文件系統和NTFS) - 那麼文件不應該被視爲「創建」,直到過程關閉文件。這應該顯示爲一個不存在的文件!
+0

編輯感謝,這是資料。 「會發生什麼?」 P.S.中的問題只是修辭。我已經更新了這個問題來反映這一點。 Ack! – WalterGR 2009-08-04 09:47:37

+0

Ack!我忘了我在問題標題中寫下了「實施/發現」。我刪除了「實施」。如果談到這一點,我會打開另一個問題。再次感謝。 – WalterGR 2009-08-04 09:51:23

0

假設一個日誌文件系統(大多數Linux文件系統和NTFS) - 那麼該文件不應被理解爲「創造」,直到處理 關閉的文件中看到。這應該顯示爲一個不存在的文件!

不,它一旦創建就可見,您必須將其鎖定。 重命名是原子,但。所以你可以打開(),寫入(),關閉(),重命名(),但這不會阻止同一時間重新創建兩次相同的緩存項目。

緩存文件被刪除,因爲它已被廢棄。 該文件的請求進入,並且該文件正在重新創建過程中。在此期間,另一個文件請求進入。

如果未鎖定,則會提供半完整文件,或者兩個進程將嘗試同時重新生成相同的文件,從而產生「有趣」的結果。

2

看來PEAR :: Cache_Lite具有某種安全性來處理併發問題。
如果你看一看的constructor Cache_Lite::Cache_Lite手冊,你有這些選擇:

fileLocking 啓用/禁用fileLocking。可以避免在惡劣的 的情況下緩存損壞。

writeControl 啓用/禁用寫入控制。啓用寫入控制將輕輕緩慢地寫入緩存 但不會讀取緩存 。寫控制可以檢測到一些 損壞的緩存文件,但也許它不是 一個完美的控制。

readControl 啓用/禁用讀取控制。如果啓用,控制鍵在 緩存文件包埋,此鍵進行比較 與閱讀

readControlType 讀控制類型的 後計算出的(僅在讀控制啓用)。必須是「MD5」 (爲一個MD5哈希控制(最好但 最慢)),「CRC32」(爲一個CRC32散列 控制(安全性稍差,但 更快))或「strlen的」(爲一個長度 僅測試(最快))

要使用哪一個仍然取決於您,取決於您準備犧牲哪種性能 - 以及可能存在於應用程序中的併發訪問風險。


你可能也想看看Zend_Cache_Frontend_Output,緩存頁面,使用類似Zend_Cache_Backend_File作爲後端。

這一個似乎支持某種形式的安全性,以及 - 東西一樣kinf是Cache_Lite已經給了你(所以我不會複製粘貼第二次)


作爲旁註,如果你的網站運行在共享主機上,我想它沒有那麼多用戶?所以併發訪問的風險可能並不高,是嗎?

無論如何,我可能不會搜索任何進一步什麼那些拖框架建議:它已經可能足以滿足您的應用需要更多的:-)

(我從來沒有見過任何緩存mecanism 「更安全」比那些允許你這樣做......我從來沒有碰到諸如此類的一些災難性的併發問題尚未...在這3年PHP開發的)


總之:有好玩!

+0

Pear Cache_Light不處理所有的併發問題 - 例如,當文件被鎖定寫入時從緩存中讀取。 (或者我應該說:併發性問題是針對應用程序代碼的。)這對我來說是不可行的。你問,「......所以併發訪問的風險可能不是那麼高,是嗎?」儘管訪問次數明顯呈現出較大的趨勢(例如,在中午更多,週三更多),但從第二位到第二位的頁面請求是隨機的。併發性是所有網站的問題。 – WalterGR 2009-08-04 11:55:49

0

您可以在數據庫中緩存頁面,只需創建一個簡單的「名稱,值」表並在其上存儲緩存的頁面即可。

1

我會試圖修改一個現有的緩存。Zend Framework的緩存應該能夠做到這一點。如果不是,我會改變它。

您可以創建一個非常原始的鎖定策略。該數據庫可用於追蹤所有緩存項目,允許鎖定更新,允許人們等待其他人的更新完成,...

這將處理您的ACID問題。您可以在很短的時間內爲其他人的更新設置鎖定,或者根據您的服務器負載/容量以及生成緩存內容的成本,可能只是在整個過程中跳過緩存。

雅各

1

併發資源創建又名緩存猛擊/線程的比賽可以在繁忙的網站是一個嚴重問題。這就是爲什麼我創建了同步讀/寫進程/線程的緩存庫。

它具有優雅和清晰的結構:接口 - >適配器 - >類,方便擴展。在github頁面中,我將詳細解釋砰擊問題以及圖書館如何解決問題。

檢查在這裏: https://github.com/tztztztz/php-no-slam-cache