2010-06-22 27 views
1

我有一些從數據庫(MySQL)很少更新的小數據集。
基本上有3或4個小型二維陣列(50-200項)。
這是memcached的理想情況,但我在共享服務器上,無法安裝任何東西。
我只有PHP和MySQL。php窮人的緩存

我正在考慮將數組存儲在文件中,並每2-3小時通過cron作業重新生成文件。

有關此方法的更好的想法或建議?
什麼是存儲這些數組的最佳方式?

+0

您目前是否遇到過與這些陣列相關的任何性能問題? – 2010-06-22 09:53:18

+0

@Col。彈片我必須從每個頁面的數據庫中獲取這些信息。 和MySQL正在死亡負載的原因... – 2010-06-22 09:59:58

+0

@ILMV jslint ???我認爲你粘貼了錯誤的鏈接... – 2010-06-22 10:01:16

回答

2

如果您使用的是過度勞累的MySQL服務器,那麼是的,請將該數據緩存到文件中。然後你有兩種方法來更新你的緩存:無論是通過cron作業,無條件地,每隔N分鐘(我不會更新頻率低於每小時)或每次數據更改。最好的方法取決於你的具體情況。一般來說,cron作業的方式是最簡單的,但改變的方式幾乎可以保證你永遠不會使用陳舊的數據。

至於存儲格式,你可以serialize()數組並將字符串保存到文件中。對於大數組,unserialize()比大數組(...)聲明更快。

+0

感謝您的提示,我會研究一下 – 2010-06-22 11:22:46

1

正如在評論中所說,最好檢查問題的根源是否不能先被修復。往返聽起來像是網絡配置問題。

否則,如果數據庫只是那麼慢,沒有任何說話反對基於文件系統的緩存。您可以將每個查詢轉換爲一個md5()散列,並將其用作文件名。 Serialize()將結果設置到文件中並從該文件中獲取。使用filemtime()來確定緩存文件是否早於x小時。如果是,請重新生成查詢 - 或者事實上,爲了避免緩存文件發生鎖定問題,請使用cron作業重新生成它。

請注意,這樣你就會處理整個結果集,你必須一次加載到腳本的內存中。您不會有能夠逐行查詢結果集的優勢。這可以通過緩存的方式完成,但它更復雜。

+0

我想我會用你的混合物,卡洛斯和喬希的答案:-) – 2010-06-22 11:25:01

1

我的英語不好,抱歉。

有些時候我已經讀過有關memcache的任何替代方法。是複雜的,但我認爲你可以使用http://www.php.net/manual/en/ref.sem.php加入共享內存。

用於存儲數據的簡單類的例子是在這裏: http://apuntesytrucosdeprogramacion.blogspot.com/2007/12/php-variables-en-memoria-compartida.html

寫的是西班牙語,對不起,但代碼很容易理解(Eliminar =刪除)

我從來沒有測試該代碼!我不知道它在共享服務器中是否可行。

+0

米ingles tampoco debe ser muy bueno,juzgar por la cantidad de comentarios que necesite poner para que entiendan de que hablaba ... Lo mirare mas tarde,ahora necesito dormir un poco,gracias – 2010-06-22 11:20:14