2012-01-16 63 views
4

試圖找遍這個答案,但打牆。Memcache php cli vs apache使用不同的緩存?

代碼:(保存爲recent.php)

$MEMCACHE_SERVERS = array(
    "1.2.3.4", //db prodmaster 
    "5.6.7.8", //db prodslave1 
    "9.10.11.12" //db1 dev 
); 

$memcache = new Memcache(); 
foreach($MEMCACHE_SERVERS as $server){ 
    $memcache->addServer($server,11211); 
} 
$key = "rec_obj_".$cat_id; 
$memcache->delete($key); 
$memcache->set($key, $objects, MEMCACHE_COMPRESSED, $time=60*60*4); 

鑑於上面的代碼,爲什麼從CLI與Apache上運行時,訪問不同的緩存?當我從命令行運行php /var/www/localhost/htdocs/url/recent.php時,它運行完美,但是我無法通過$ memcache-> get($ key)從我的網站檢索數據。 反之亦然,當我從網頁瀏覽器http://www.url.com/recent.php運行相同的腳本它運行完美,但它不能從命令行找到?可以通過$ memcache-> get($ key)在命令行中運行命令行memcache結果,通過web broswer中的$ memcache-> get($ key)可以找到web瀏覽器結果。 CLI和Web緩存似乎是分開的,我該如何解決這個問題?

我檢查我的phpinfo(),php-apache2和php-cli都有擴展名= memcache.so。另外,我想這可能是哈希差異,但都表示:

Directive    Local Value Master Value 
memcache.allow_failover 1 1 
memcache.chunk_size 8192 8192 
memcache.default_port 11211 11211 
memcache.default_timeout_ms 1000 1000 
memcache.hash_function crc32 crc32 
memcache.hash_strategy consistent consistent 
memcache.max_failover_attempts 100 100 

也試過輸出狀態和檢查$ memcache-> getExtendedStats();從命令和網絡瀏覽器。兩者都顯示全部3臺服務器其中一些值雖然不同,但像curr_items或回收,但關閉了10左右。

感覺就像我錯過了什麼..我可以做一個解決方法,只是將數據保存到MySQL表中,但這不會回答爲什麼會發生這種情況的問題。

我試圖提供所有我認爲需要的信息,但隨時可以要求澄清。

+0

假設$ cat_id是一個提供的整數。在兩種環境中都是一樣的,而不是問題。 – 2012-01-16 18:56:36

+2

如果您告訴它只使用三臺服務器中的一臺,會發生什麼? – Charles 2012-01-17 01:07:52

+1

良好的捕獲,當只使用1臺服務器,它似乎工作。將其縮小爲分配cli與apache不同的平板,或者一個無法正確訪問全部3臺服務器。我會研究這個。感謝您的支持。 – 2012-01-17 17:29:00

回答

1

運行CLI PHP時,將以用戶身份運行它。當你通過Apache訪問它時,它以apache用戶身份運行(www-data或類似的)。 memcached實際上關心你的用戶名,它會爲不同的用戶創建不同的緩存。所以你有兩個完全獨立的緩存。

您可以在Linux上使用sudo ipcs列出這些緩存,查看Shared Memory Segments。查看「所有者」專欄,您可能會看到兩者。我個人通過運行我的CLI PHP作爲www數據用戶來解決這個問題:

sudo su www-data -c "php lawl.php" 
+0

但爲什麼它似乎與1臺服務器一起工作? – 2012-04-05 08:40:38

+0

Gremlins? :)我有同樣的問題,除了我無法讓它與1臺服務器一起工作。簡單的解釋是「我的答案是錯誤的」,但我想看看'ipcs'的輸出;這太完美了,就像我的問題一樣,我輕易相信這不是同一個問題。 :) – Mike 2012-04-05 08:48:14