2008
11.21

WP Object Cache 問題

昨晚弄好 Object cache 之後,修改了 addServer() 的傳入參數部份才能順利執行。詳見我寫的:WordPress 使用 Memcached最下面程式部份。

原本以為我可以 Happily Ever After ,不過今天早上搭捷運上班的時候越想越奇怪…到了公司後,邊吃早餐邊瀏覽了一下程式碼,卻在 object-cache.php (trunk 版本) 發現一個問題:

function WP_Object_Cache() {
  global $memcached_servers;

  if(isset($memcached_servers))
    $buckets = $memcached_servers;
  else
    $buckets = array('default' => array('127.0.0.1:11211'));

  foreach ( $buckets as $bucket => $servers) {
    $this->mc[$bucket] = new Memcache();
      foreach ( $servers as $server  ) {
        list ( $node, $port ) = explode(':', $server);
        $this->mc[$bucket]->addServer($node,$port,true,1,1,15,true,array($this, 'failure_callback'));
        $this->mc[$bucket]->setCompressThreshold(20000, 0.2);
      }
  }
}

如果直接 die(var_dump($memcached_servers)); 或是 die(var_dump($buckets); 會發現值都是 1

在 php.ini 裡面我找不到 Memcache Server 和 Port 的設置參數。我猜想程式應該也無法從任何地方取得這項資訊。以上這是 Object-Cache.php 2.0 (PECL) 的寫法。不過在 Object-Cache.php 1.0(sockets) 的寫法內,有一個 memcached-client 可以指定伺服器的設置。

為了暫時解決我的疑惑,乾脆手動指定全域變數,讓參數可以真的傳入 addServer() 內:

/* 加在 WP_Object_Cach::WP_Object_Cache() 的 global $memcached_servers; 宣告下*/
$memcached_servers = array('default' => array('127.0.0.1:11211'));
/* 或是直接指定 $buckets 這樣對程式更動最少。下面的 foreach 是為了增加多台 Memcache Server */

但我不瞭解為甚麼要用 global $memcached_servers; 我用 grep 完全找不到有地方可以設置這個全域變數。

還有,會邊吃早餐邊看這隻程式其實是因為我收到 RSS: Upgrade Memcached Before WordPress

內文:

Self-hosted WordPress and WordPress MU administrators: if you are using the memcached object cache (a prerequisite for batcache), upgrade it before upgrading WordPress. There is a bug that keeps the old db_version in the options cache, preventing WordPress from remembering that it has been upgraded, and this causes it to ask you to upgrade again. In a pinch you can resolve the problem by restarting the memcached daemon.

大意是說:所有自己架設 WordPress 和 WordPress MU 的管理員們,如果你有使用 object-cache.php 的話,請在升級 WordPress 之前先升級 object-cache 這個檔案,新的程式請直接到它的 trunk 去下載。要升級 object-cache 的原因是因為它會 cache 住資料庫的東西,造成升級之後 WP UPGRADE 程式查到的資料庫內容還是 cache 住的,它會以為還沒升級。這個版本(trunk 74885)修改的地方只有一行:第 74 行從 return true; 改為 return $wp_object_cache->delete($key, $flag);

4 comments so far

Add Your Comment
  1. 加入這行 $memcached_servers = array(‘default’ => array(’127.0.0.1:11211′)); 的目的,是指原本的程式無法順利連結到memcached嗎?

  2. 對的,如果不宣告 $memcached_servers 的話,我發現這個變數的內容是空的(或許是我有某個地方配置錯誤?),所以沒辦法取得 memcached 的 ip/port 。

    觀察我的記憶體狀態:圖中紅圈處是程式有連結到 memcached 之後的記憶體佔用,而在那之前雖然我的 memcache daemon 有跑起來,但是程式並沒有透過它去快取資料庫(所以記憶體沒有佔用)。

    點小圖可以放大,此圖是本機記憶體佔用狀況,圖中紅圈為程式修改之後,藍圈為重新開機。另外歡迎 shami 大駕光臨,如果沒有您那篇 Object-Cache ,我還不曉得 WP 有這個好東西,謝謝 :)

  3. 原來如此…我也修改了,觀察一陣子看看…

    因為我一直是使用
    http://livebookmark.net/journal/
    這套程式來觀察memcached的使用情形
    反而忘記去觀察記憶體使用狀況..

    您太客氣囉,當初會想用Object-Cache是想盡量減少外掛的使用數量,對我這種一天訪問量不高的部落格,多裝一個快取外掛,我自己測試結果並不會比較優…

  4. [...] Blog 在 WP Object Cache 問題 此篇文章提到 如果不宣告 $memcached_servers [...]

:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>