memcache はデータ中間層として、データ交換によく使用されます。
たとえば、特定のシステム内では、次のユーザー ステータス情報を各ユーザーが 52 バイトだけ保持する必要があると規定します。
キーの状態#ID (「state#10888」など)
値:(バイナリデータ)
ユーザーID Uint32
タイプ ユーザータイプ Uint8 :
状態 ユーザー状態 Uint8:
サーバーIP Uint32
最終オンライン時間 Uint64
セッションIDの長さUint16
セッションID文字[32]
合計 52 バイト
では、PHP で memcache を介して上記のデータを取得するにはどうすればよいでしょうか?
保存されたデータにバイナリの 0 が含まれています。文字列は切り詰められますか?
実は違う!
以下のテスト
$mem = 新しい Memcache();
$mem->connect('192.168.0.69',11211);
$memstr= $mem->get('state#105709');
var_dump($memstr);
次の出力が得られます。 memstr がちょうど 53 バイトであることがわかります。 sessionId には終了文字があります
string(53) "枼库F>� R!8jWFmsIK41kBDkmlqC7m7QoWICQ8nzz7"
さらに一歩進んで、データをファイルに出力し、winhex を使用してデータのステータスを確認します
file_put_contents('./dd.txt',$memstr);
16 進データを表示するには、winhex dd.txt を使用します。
ED9C01000001C0A800463EF60A520000000100386A57466D73494B34316B42446B6D6C7143376D37516F57494351386E7A7A3700
これで、主に ord 関数を使用してバイト ASCII コードを取得し、バイト単位でデータを取得できるようになりました
$type = ord($memstr{4});
$state = ord($memstr{5});
$ip = ord($memstr{6}).'.'.ord($memstr{7}).'.'.ord($memstr{8}).'.'.ord($memstr{9}) ;
$ses_long = ord($memstr{19})*16+ord($memstr{18});
// タイムスタンプには 4 バイトのみが必要で、8 バイトが割り当てられます
$lastactive = ord($memstr{13})*16777216+ord($memstr{12})*65536+ord($memstr{11})*256+ord($memstr{10});
$sessionid = substr($memstr,20,$ses_long);