簡體   English   中英

PHP APC要緩存還是不緩存?

[英]PHP APC To cache or not to cache?

我根本沒有任何緩存經驗,所以這看起來像是一個愚蠢的問題,但你怎么知道何時緩存你的數據? 我甚至找不到一個談論這個的網站,但它可能僅僅是我的搜索技巧或者可能需要考慮的太多變量?

我很可能會使用APC。 有沒有人有任何緩存它需要的數據量最少的例子? 例如,假設您有一個包含100個項目的數組,並且您在其上使用foreach循環並執行一些簡單的數組操作,是否應該緩存結果? 如果它有1000件物品,10000件物品等怎么樣?

你應該緩存數據庫查詢的結果嗎? 你應該緩存什么樣的查詢? 我假設一個簡單的選擇,也許一對mysql數據庫的連接語句不需要緩存,或者它呢? 假設啟用了mysql查詢緩存,這是否意味着您不需要在應用程序層中緩存,或者您是否還應該這樣做?

如果你實例化一個對象,你應該緩存它嗎? 如何確定是否應該緩存? 因此,關於緩存內容的一般指南會很好,示例也非常有用,謝謝。

當您在緩存從APC / memcache / WinCache / redis / etc中的數據庫中讀取的數據時,您應該知道在更新數據庫時它不會更新,除非您明確編寫代碼以保留數據庫和緩存同步。 因此,當來自數據庫的數據不經常更改時,緩存最有效,但是還需要更復雜和/或更昂貴的查詢來從數據庫中檢索該數據(否則,您也可以在數據庫中從數據庫中讀取它需要它)...如此昂貴的連接查詢在運行時返回相同的數據記錄是主要候選者。 並始終測試以查看從數據庫讀取查詢是否比從緩存更快。 正確的數據庫索引可以極大地改善數據庫訪問時間,尤其是大多數數據庫也維護自己的內部緩存,因此除非數據庫開銷合理,否則不要使用APC或等效數據來緩存數據。

您還需要了解緩存中的空間使用情況。 大多數緩存都是固定大小的,您不希望它們溢出...所以不要使用它們來存儲大量數據。 使用APC提供的apc.php腳本來監控緩存使用情況(盡管確保任何人和訪問您網站的所有人都無法公開訪問它......安全性不佳)。

當在緩存中保存對象時,對象將在存儲時被序列化(),並在被檢索時被反序列化(),因此存在開銷。 具有資源屬性的對象將丟失該資源; 所以不要存儲數據庫訪問對象。

僅使用緩存來存儲由許多/所有用戶訪問的信息而不是用戶特定數據是明智的。 對於用戶會話信息,請堅持使用普通的PHP會話。

簡單的答案是當事情變慢時緩存數據。 顯然,對於任何中型到大型應用程序,您需要做更多的規划而不僅僅是等待和觀察的方法。 但對於絕大多數網站而言,問自己的問題是“你對加載時間感到滿意嗎”。 當然,如果你像我一樣迷戀加載時間,你會想要試着讓它更快,無論如何。

接下來,您必須確定導致緩慢的具體原因。 您假設您的應用程序代碼是源代碼,但是如果存在其他外部因素(如大頁面文件大小,請求過多,沒有gzip等),則需要檢查它。使用http://tools.pingdom.com/等網站像yslow這樣的擴展就是一個開始。 (快速提示確保Keepalive和gzip正常工作)。

假設問題是應用程序代碼的執行持續時間,那么您將需要使用xdebug(http://www.xdebug.org/)來編寫代碼,並使用kcachegrind或wincachegrind查看輸出。 這將讓您知道代碼的哪些部分需要很長時間才能運行。 從那里,您將決定緩存內容以及如何緩存它(或改進代碼邏輯)。

對於問題可能存在的可能性和相關解決方案有很多可能性,我不值得猜測。 因此,一旦確定問題,您可能希望發布與解決該特定問題相關的新問題。 我會說如果使用不當,mysql查詢緩存可能會適得其反。 另外,我通常避免使用APC用戶緩存來支持memcached。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM