2011-02-02 143 views
8

我根本沒有任何緩存經驗,所以這可能看起來像一個愚蠢的問題,但你怎麼知道何時緩存你的數據?我甚至無法找到一個討論這個問題的網站,但這可能只是我的搜索技能或可能考慮的變量太多而已。PHP APC要緩存還是不緩存?

我很可能會使用APC。有沒有人有任何例子來說明緩存數據所需的最少數據量?例如,假設你有一個包含100個項目的數組,並且你使用了一個foreach循環並且執行一些簡單的數組操作,你應該緩存結果嗎?如果它有1000個項目,10000個項目等,那該怎麼辦?

你應該緩存數據庫查詢的結果嗎?你應該緩存什麼類型的查詢?我假設一個簡單的選擇,也許幾個連接到MySQL數據庫的聲明不需要緩存,或者它呢?假設mysql查詢緩存處於打開狀態,這是否意味着您不需要在應用程序層緩存,還是應該這樣做?

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

回答

10

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

您還需要了解緩存中的空間使用情況。大多數緩存是固定大小的,你不想過度填充它們......所以不要使用它們來存儲大量的數據。使用APC提供的apc.php腳本來監控緩存的使用情況(儘管確保訪問您的網站的任何人和每個人都不能公開訪問這些安全問題)。

將對象保存在緩存中時,該對象在被存儲時將被序列化(),而在被檢索時將被序列化(),所以會產生開銷。具有資源屬性的對象將失去該資源;所以不要存儲你的數據庫訪問對象。

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

+4

@Joker就像一個小插件,Incase你還不知道,APC提供了2種類型的緩存,一種由php內部使用的操作碼緩存,可以「讓它更快」,以及可以用來存儲的用戶緩存數據。用戶緩存是您在這裏需要的部分。 (道歉,如果這是教人們如何吸雞蛋 - 但希望它可能會有助於其他誰遇到這個問題) – 2011-02-02 12:27:52

0

簡單的答案是,當事情變得緩慢時,緩存數據。顯然,對於任何大中型應用程序而言,您需要做更多的規劃,而不僅僅是觀望的方法。但是對於絕大多數網站來說,問自己的問題是:「你對加載時間感到滿意嗎?」。當然,如果你像我一樣對加載時間感到迷戀,那麼無論如何,你都會試圖讓它更快。

接下來,您必須明確具體是什麼原因的慢度。你認爲你的應用程序代碼是源代碼,但是它的價值在於檢查是否存在其他外部因素,例如大頁面文件大小,過多請求,沒有gzip等。使用像http://tools.pingdom.com/這樣的站點或像yslow這樣的擴展作爲開始。 (快速提示確保keepalives和gzip正在工作)。

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

問題可能出現以及相關解決方案的可能性很大,不值得我猜測。所以,一旦你發現問題,你可能想發佈一個與解決這個特定問題有關的新問題。我會說,如果使用不當,mysql查詢緩存可能會產生反效果。另外,我通常避免使用APC用戶緩存來支持memcached。