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'];
set: $out = array(); $out['field1'] = "me"; $mc->set($key, serilized($out), NULL, 12 * 3600); get: $out=$mc->get($key); echo unserilized($out)['field1'];