ホームページ  >  記事  >  バックエンド開発  >  Java と PHP 間で memcached データを共有する場合は、関連する問題に注意してください

Java と PHP 間で memcached データを共有する場合は、関連する問題に注意してください

WBOY
WBOYオリジナル
2016-06-13 13:06:20811ブラウズ

Java と php 間で memcached データを共有する際の問題に関するメモ
多くの場合、memcached サーバー内のデータには、クライアントがさまざまな言語でアクセスする必要があります。

理想的な世界では、ある言語で書き、別の言語で読んでも、互換性の問題が発生しない可能性があります。

最近、Java と PHP がデータを共有する際に問題が発生しました。PHP が書き込むと、Java はそれを読み取ることができますが、Java が書き込むと、PHP がデータを読み取り、データが正しく解析されません。

memcached のデータを分析します:
telnet memcache-srv1 11211
get key[enter]

php で書き込まれたデータとJavaによって書き込まれたデータ。

php:VALUE key 1 250
java:VALUE key 0 250

すでにお気づきかもしれませんが、これはステータス ビットの不一致が原因です。このステータスは、Javaでは圧縮などの識別に使用され、PHPではPHPを判断するためのオブジェクト(例:配列など)として使用されます。
PHP コードを確認すると、配列オブジェクトが PHP memcached 関数に直接渡され、それがシリアル化され、読み取り時に識別子が追加されることがわかりました。

   set:
   $out = array();
   $out['field1'] = "me";
   $mc->set($key, $out, NULL, 12 * 3600);
   
   get:
   $out=$mc->get($key);
   echo $out['field1'];

解決策:
php memcached クライアントに渡すときは、最初にシリアル化します。フェッチするときに一度デシリアライズします。
   set:
   $out = array();
   $out['field1'] = "me";
   $mc->set($key, serilized($out), NULL, 12 * 3600);
   
   get:
   $out=$mc->get($key);
   echo unserilized($out)['field1'];
   

または、Java の memcacheClient ソース コードを変更することはお勧めできません。

1階 a254939392 2011-10-11
壮大に少しずつ少しずつ少しずつ少しずつ少しずつ
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。