ホームページ >バックエンド開発 >PHPチュートリアル >PHP が memcache バイナリ データを読み取る_PHP チュートリアル

PHP が memcache バイナリ データを読み取る_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-15 13:21:40985ブラウズ

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);

www.bkjia.com本当http://www.bkjia.com/PHPjc/477168.html技術記事 memcache はデータ中間層として、データ交換によく使用されます。 たとえば、特定のシステム内では、次のユーザー ステータス情報を各ユーザーが 52 バイトだけ保持する必要があると規定しています。 ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。