PHP တွင် Socket Cane များပြုလုပ်ရာတွင်ကျွန်ုပ်တို့သည်အခြေအနေများ (encapapsulate) ကိုထုပ်ပိုးရန်နှင့်ဒေတာများကိုအကာအကွယ်ပေးရန်လိုအပ်သည့်အခြေအနေများကိုဖြည်ရန်လိုအပ်သည့်အခြေအနေများကိုမကြာခဏကြုံတွေ့ရလေ့ရှိသည်။ Pack () function သည်ဤပြ problem နာကိုဖြေရှင်းရန်လက်နက်ဖြစ်သည်။ ဤဆောင်းပါးသည် အထုပ် () function ကို Socket Communication တွင်သတ်သတ်မှတ်မှတ်အသုံးပြုမှုကိုရှင်းပြရန်ရိုးရှင်းသောဥပမာတစ်ခုကိုပေါင်းစပ်ပါမည်။
Pack () သည် PHP ၏ built-in function တစ်ခုဖြစ်သည်။ ၎င်းသည်သတ်မှတ်ထားသောပုံစံအရဒေတာများကို binary strings များထဲသို့ထည့်နိုင်သည်။ ဤနည်းအားဖြင့်ပြုပြင်ထားသောအချက်အလက်များသည်ကွန်ယက်ကိုထုတ်လွှင့်ရန်ပိုမိုကျစ်လစ်သိပ်သည်းသည်။
အခြေခံ syntax ဖြစ်ပါတယ်:
string pack ( string $format , mixed $args [, mixed $... ] )
$ format သည်ကိန်းဂဏန်းများ, ဇာတ်ကောင်, ရေပေါ်အမှတ်စစသည့်ထုပ်ပိုးမှုစည်းမျဉ်းများကိုသတ်မှတ်ပေးသော format string တစ်ခုဖြစ်သည်။
အဆိုပါနောက်ဆက်တွဲ parametersters သက်ဆိုင်ရာပုံစံအတွက်ဒေတာဖြစ်ကြသည်။
Socket Communication တွင်ဒေတာများကို byte stream တွင်ပို့သည်။ ကွဲပြားခြားနားသောစက်များ၏ Entianness သည်ကွဲပြားခြားနားပြီးစာသားသို့မဟုတ်ပုံမှန်အချက်အလက်များကိုတိုက်ရိုက်ပေးပို့ခြင်းသည်လက်ခံသူအားအမှားအယွင်းများကိုဖြစ်ပေါ်စေနိုင်သည်။
Pack () လုပ်နိုင်သည် -
ပေးပို့ခြင်းနှင့်လက်ခံခြင်း၏အပိုင်းများသည်တသမတ်တည်းဖြစ်ကြောင်းသေချာစေရန်အချက်အလက်များကိုသတ်မှတ်ထားသောပုံစံဖြင့်အချက်အလက်များကိုသတ်မှတ်ထားသည့်ပုံစံဖြင့် encode လုပ်ပါ။
Enterianness ပြ issues နာများကိုကိုင်တွယ်ပါ (Big Endian, Little endian) ။
လွယ်ကူသောထုတ်လွှင့်ခြင်းနှင့်ခွဲခြမ်းစိတ်ဖြာခြင်းအတွက်သတ်မှတ်ထားသောအရှည်ဖြင့် binary data ကိုထုတ်လုပ်ပါ။
TCP Socket မှတစ်ဆင့် data packet တစ်ခုပို့လိုပါကပုံစံသည်အောက်ပါအတိုင်းဖြစ်သည် -
လယ်ကွင်း | ပုံနှိပ်စာ | ဥပမာပြပါ |
---|---|---|
အထုပ်အရှည် | လက်မှတ်မပြည့်မီတိုတို (2 bytes) | အထုပ်အရှည် field သူ့ဟာသူဖယ်ထုတ်ပြီးအထုပ်အရှည် |
command နံပါတ် | လက်မှတ်မပြည့်မီတိုတို (2 bytes) | Command ID |
အချက်များ | ကြိုး | တိကျသောအကြောင်းအရာ |
<?php
// Simulate Simulate ဒေတာ
$command = 1001;
$data = "Hello, socket communication!";
// ဒေတာအရှည်တွက်ချက်
$dataLen = strlen($data);
// အထုပ်၏အရှည်သည် command နံပါတ်အရှည်ဖြစ်သည် + ဒေတာအရှည် (2 + $dataLen)
$packetLen = 2 + $dataLen;
// အသုံးပြု pack အထုပ်အရှည်နှင့် command နံပါတ်(အသုံးပြု网络字节序,Big Endian)
$header = pack('n', $packetLen) . pack('n', $command);
// ပြီးပြည့်စုံသောအထုပ် splicing
$packet = $header . $data;
// ကထူထောင်ခဲ့တာယူဆ socket ဆက်,socket_write ဒေတာပို့ပါ
// socket_write($socket, $packet, strlen($packet));
echo "发送的二进制ဒေတာအရှည်: " . strlen($packet) . "\n";
echo "binary ဒေတာ16အမျိုးအစားကိုယ်စားပြုမှု: " . bin2hex($packet) . "\n";
?>
Pack ('N', $ packetlen) သည်လက်မှတ်မထိုးထားသောကိန်းဂဏန်းများ (2 bytes) နှင့် Network Enterianness တွင် $ packetlen ကို ထုပ်ပိုးခြင်း (By Endianness) တွင်ထုပ်ပိုးထားသည်။
Pack ('N', $ command) အလားတူ, command နံပါတ်ကိုထုပ်ပိုးပါ။
splicing ပြီးနောက်အထုပ်သည်အချက်အလက်အကြောင်းအရာကိုလိုက်နာသည်။
ဒေတာကိုလက်ခံရရှိပြီးနောက်၎င်းကိုသင်ဤကဲ့သို့သောခွဲခြမ်းစိတ်ဖြာနိုင်သည်။
<?php
// ယူဆချက် $recvData ဟုတ်ကဲ့ socket Binary Data ကိုဖတ်ပါ
// ဥပမာအားဖြင့်: $recvData = socket_read($socket, 1024);
// ပထမ ဦး ဆုံးအထုပ်အရှည်နှင့် command ကိုနံပါတ် parse
$header = substr($recvData, 0, 4);
list($packetLen, $command) = array_values(unpack('npacketLen/command', $header));
// ဒေတာအကြောင်းအရာကိုထုတ်ယူပါ
$data = substr($recvData, 4, $packetLen - 2);
echo "အထုပ်အရှည်: $packetLen\n";
echo "command နံပါတ်: $command\n";
echo "ဒေတာအကြောင်းအရာ: $data\n";
?>
Pack () function သည် binary data ထုပ်ပိုးခြင်းအတွက်အစွမ်းထက်သောကိရိယာတစ်ခုဖြစ်ပြီးကွန်ယက် protocols နှင့် binary file operations အမျိုးမျိုးအတွက်သင့်တော်သည်။
Socket Communication တွင် Pack () ၏ဆင်ခြင်တုံတရားအသုံးပြုခြင်း () သည်အခြေခံအချက်အလက်ပုံစံနှင့်တည်ငြိမ်သောဆက်သွယ်ရေးကိုသေချာစေနိုင်သည်။
unpack () function ကိုနှင့်အတူပေါင်းစပ်, binary ဒေတာခွဲခြမ်းစိတ်ဖြာအလွယ်တကူဖျော်ဖြေနိုင်ပါတယ်။
Enterianity ပြ issue နာကိုအထူးဂရုပြုပါ။ ကွန်ယက်ဆက်သွယ်မှုသည်ယေဘုယျအားဖြင့်ကွန်ယက် Enterianness (Big Entianness) ကို လက်ခံသည်။
အကယ်. သင်သည် Binary protocols များကို အခြေခံ. ကွန်ယက်ဆက်သွယ်မှုကိုလုပ်ဆောင်နေပါက အထုပ် () ကို လေ့ကျင့်ရန်နှင့် ထုပ်ပိုးခြင်း () ကို လေ့ကျင့်ရန်အထူးအကြံပြုလိုပါသည်။