2011-12-13 92 views
2

我想在Python和PHP之間共享一個Memcache密鑰。 Python寫入密鑰並由PHP讀取。我使用CakePHP框架,使用php-pecl-memcache(而不是php-pecl-memcached),以及python-memcache所有的python庫。與PHP和Python共享Memcache

的Python:

mc = memcache.Client(["127.0.0.1:11211"]) 
    key = "key1" 
    value = 1323779849 
    mc.set(key, value) 

PHP:

echo Cache::read('key1', 'memcached'); 

PHP不能讀取變量,我得到奇怪的「MemcachePool ::得到()[http://php.net/memcachepool .get]:未能解壓縮數據「錯誤;我懷疑它與每個庫中設置不同的memcached標誌有關。

這是當我telnet到memcached的會發生什麼:

Python的設置項:

get key1 
VALUE key1 1 12 
1323779849 
. 
END 

PHP設置項:

get key1 
VALUE key 1 0 12 
1323779849 
END 
  • 有沒有覆蓋這些標誌的方式只是「做你自己的事情」?
  • 是否有php/python memcache庫在一起玩的更好?
  • 另外,有沒有一種簡單的方法來創建一個公共內存空間之間的蟒蛇/ PHP?
+0

謝謝,但我想要做的是共享一個簡單的數據類型,無論是一個int或一個字符串,所以不需要序列化,pickle甚至壓縮。我寧願不寫信給文件,因爲性能的影響,雖然是的,那會有訣竅。 –

+0

如果你已經嘗試了整數和字符串,我認爲你可以避免使用(一致的)序列化。 –

+0

你可能會錯過一些觀點,memcache有一個壓縮和序列化數據的選項(甚至只是一個字節)。這更多用於內部使用。我猜python API是默認啓用壓縮的,而你的PHP api在默認情況下並未啓用它。你沒有提到你用於memcache的API,所以我想沒有人能真正挖掘這些文檔並提供一個洞察力的答案。 – ajreal

回答

3

終於搞定了。洛特的東西沒有按預期工作。

  1. 一個問題是,PHP和Python使用不同的標誌來做不同的事情。 在全部python或全部php解決方案中不是問題,但是對於環境間通信來說是一個真正的問題。一個有用的資源是http://www.hjp.at/zettel/m/memcached_flags.rxml,它顯示python-memcache將長整型標記爲'2',這是php-memcache不理解的,因此壓縮錯誤。我修改了python-memcache,在set函數中加入了'flag-override'。無論python memcache認爲它應該是什麼,該變量只會強制一個特定的標誌。這允許我將Int從2重新標記爲0.我將prob分支當前版本的python-memcache並將其提交給Github。這允許我強制python長int標誌(2)到PHP會理解(0)的東西。

  2. 1.3.3之前的CakePhp將所有密鑰存儲在memcached中,並附加一個key_expires密鑰,標記爲768等。如果沒有這個附加密鑰,它找不到您要找的密鑰。謝天謝地,這個行爲在後來的Cakephp版本中被拋棄了(我簡單地升級到1.3.13),現在它運行良好。

+0

另一件事是:I也可以切換到Mysql MEMORY/HEAP表類型,並實現同樣的效果 –

+0

壓縮錯誤很容易避免使用pylibmc正確編譯和標記最大的一個in-de pth bugs是字符串鍵值。當你使用set()方法時總是使用str()表示鍵名和值。都。或者你會發現在實際的字符串內容之前有7個字節的垃圾。當心=) –

0

當你通過python memcached放置東西時,它可能被醃漬。所以PHP不能解開它。我會嘗試使用某種非常基本的類型可能ctypes?也許原始字符串?

+0

我試過原始字符串和直整數,都沒有工作:( –

+0

還有一件事。以前我用會話和會話cookie在php/python之間進行通信。有一個缺點,它依賴於機器,所以如果你有多集羣技術可能會很糟糕,否則它很簡單,你可以將文件中的會話保留在你的硬盤上,數據可以像字符串一樣傳輸,這不是一個非常靈活的解決方案,但是它對我來說只有一次。 – Drachenfels

+0

還有一件事,你可以嘗試使用cmemache而不是memcache,但可能會有所幫助,但是我懷疑,你可以嘗試在通信中使用一些快速數據庫,比如說讓noSql(Riak,CouchDB等)或SqlLite。 – Drachenfels