memcache作為一個數據中間層,經常用來做數據交換。
比如在某個系統內部我們規定如下的用戶狀態的信息,每個用戶只需要存續52個字節。
Key state#ID 如”state#10888”
Value : (二進制的數據 )
用戶 ID Uint32
Type 用戶類型 Uint8 :
State 用戶狀態 Uint8 :
服務器 IP Uint32
最後在線時間 Uint64
Session ID的長度 Uint16
Session ID char[32]
總共52個字節
那麼怎麼在php裡面得到通過memcache得到上面的這些數據呢?
存儲的數據裡面有二進制的0,字符串是否會被截斷?
其實不會的!
下面進行測試
$mem = new 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);
用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);