Python を使用して大量のデータを memcached に保存するアプリケーションがあります。Python では pylibmc を使用し、php 側では php-memcached ライブラリを使用しています。
- pylibmc v.1.2.3
- php-memcached v.2.0.1
- libmemcached v1.0.8。
圧縮が機能する場合を除いて、他のすべては問題ありません。これは、Pythonでデータを圧縮する方法です
import pylibmc
mem = pylibmc.Client(['10.90.15.104:11211'], binary=True)
mem.set('foo','this is a rather long string. this is a rather '+
'long string. this is a rather long string. this is a rather' +
'long string. this is a rather long string', 0, 10)
telnet でチェックインすると、圧縮されていることを意味する文字化けした値が表示されます。今phpでそれを読んでいます。
$memd = new Memcached();
$memd->addServer('10.90.15.104', 11211);
echo $memd->get('foo');
上記を実行すると、同じ文字化けした値が得られます。これは、圧縮が解除されていないことを意味します。pylibmc は zlib を使用しているため、それに合わせて php の圧縮タイプも zlib に変更しました。他にどのような設定を行う必要がありますか? 助けてください。
さらに参照するために、python pylibmc で文字列を設定した後の memcached の出力を次に示します。
get foo
VALUE foo 8 40
x+��,V�D��Ē��"����t�⒢̼t=���g\5#
END
PHP の memcached クライアントを使用して格納された文字列の memcached の出力は次のとおりです。
get foo
VALUE foo 48 44
�x�+��,V�D��Ē��"����t�⒢̼t=���g\5#
END
ご覧のとおり、これには怪しいものがあります。pylibmc の圧縮サイズは 40 バイトで、php-memcached を使用して圧縮された同じデータは 44 バイトです。また、フラグが pylibmc を使用して保存された場合は 8、php-memcached を使用して保存された場合は 48 であることに注意してください。