1

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 であることに注意してください。

4

2 に答える 2

3

あなたが観察しているのは、memcache自体が圧縮を実装していないため、各ライブラリが独自の方法で圧縮を実装しているためだと思います。圧縮が使用されていることを示すために使用されるフラグを比較するだけです。

pylibmcによって定義されたように

#define PYLIBMC_FLAG_ZLIB (1 << 3) (つまり、これはフラグ== 8です)

php-memcachedによって

#define MEMC_VAL_COMPRESSED (1<<4)

#define MEMC_VAL_COMPRESSION_ZLIB (1<<5)

#define MEMC_VAL_COMPRESSION_FASTLZ (1<<6)

したがって、このライブラリの1つを変更して、フラグを他のライブラリと一致させることをいとわない限り、解決策はないと思います。

編集: わかりました。これが、pylibmcとphp-memcachedの圧縮サポートを同期させる小さなパッチです。pylibmcの私のgithubフォークを参照してください。

大きなファットウォーリング-文字列でのみ機能するため、オブジェクトを保存する場合は、自分で逆シリアル化/シリアル化を行う必要があります(JSON)。

于 2012-12-17T15:41:48.770 に答える
1

ラバー、

あなたが言ったように、私は変更を行いました

  1. PHP圧縮方式をFASTLZからZLIBに変更
  2. _pylibmcmodule.h ファイルで pyLibmc フラグを 1 << 5 に変更し、pylibmc を再インストールしました

    #define PYLIBMC_FLAG_ZLIB (1 << 5)
    

これらの変更は正しいですか?さらに何かする必要がありますか?動作していないため、次のエラーが発生します

Warning: Memcached::get(): unknown payload type in uaTestMemcached.php on line 5

bool(false)
于 2012-12-19T08:20:51.660 に答える