2011-05-19 30 views
8

我目前通過將動態生成的PHP頁面保存到具有到期時間字段的數據庫來緩存。如果再次請求該頁面,則程序檢查要提供的頁面的未過期緩存版本,並且只在頁面找不到時重新生成該頁面。PHP緩存 - 保存數據庫還是創建文件的速度更快?

這很好 - 但它會減少服務器上的負載,以將緩存的頁面保存爲文件,而不是保存到數據庫中?我可以在文件中使用命名約定來處理到期時間。

如果從文件而不是數據庫讀取/寫入文件的速度更快,服務器稅率更低,我會切換到該文件。有誰知道哪個更快/最好的做法?

回答

6

如果從文件而不是數據庫讀取/寫入文件的速度更快,服務器稅率更低,我會切換到該文件夾​​。有誰知道哪個更快/最好的做法?

最快的是使用靜態文件,因爲您甚至可以在不啓動PHP(使用RewriteRules)的情況下發出緩存。但是,如果您有多個前端,它將無法正確縮放。

下一個最好的事情是將它存儲在內存中,例如使用Memcache

最不可取的是使用SQL。如果你堅持使用它,至少通過使用內存存儲引擎或同類產品(例如,如果你使用的是PostgreSQL,存放在RAM磁盤上的表空間中的未記錄表)來幫助你的硬盤驅動器。

+0

謝謝丹尼斯在這裏有一些很棒的想法 - 我會研究它們。 – Dan 2011-05-19 04:05:59

+1

作爲後續工作,我在兩種替代方案之前和之後使用了microtime(),並且該腳本可以創建一個文件,寫入並關閉,比在MySQL中執行insert語句快75%。這是在幾毫秒內,但在高峯流量,這將真的有幫助...特別是當我遇到失敗的MySQL連接時,太多的用戶一次開始。 – Dan 2011-05-19 05:02:41

+0

測量文件寫入性能時,不要忘記計算文件鎖定。根據我的經驗,最好的方法是創建一個臨時文件,然後將其重命名爲最終位置。這使它在寫入時稍慢,但它避免了併發寫入問題。 – 2011-05-19 05:06:02

2

這兩個選項都使用文件系統,因爲(假設您使用的MySQL沒有MEMORY/HEAP表)數據庫記錄仍然存儲在文件中。

如果您在請求緩存數據時有活動的數據庫連接,我會堅持使用數據庫。

+0

謝謝!是的,連接已經打開,因爲會話管理也是通過數據庫進行的,我會在評估緩存是否存在之前就對用戶進行了身份驗證。聽起來像我應該離開它。 – Dan 2011-05-19 03:46:27

+0

內存/堆是否仍然寫入WAL? – 2011-05-19 03:47:21

0

這是一件有趣的事情,我從來沒有嘗試過,但聽過好東西。您可以使用Google Spreadsheet API通過http請求充當數據庫。這聽起來(至少在理論上)像是對這樣的問題的理想解決方案。不是你的問題的答案只是另一種選擇。

+0

謝謝!我會檢查出來 – Dan 2011-05-19 03:44:55

0

對於你的問題沒有一個真正的答案,它實際上取決於查詢的數量和數據庫使用的緩存,而不是解析文件所花費的時間。許多其他因素也可能發生。

但是您可以使用PHP擴展,如Memcached,正如Denis所建議的。通過使用像Doctrine這樣的框架,這可以更好地與數據庫結合使用。這使得使用數據庫管理數據變得很容易。通過緩存查詢結果來爲生產中的實際數據提供服務。

相關問題