PHP Development တွင် PHP () function ကိုမကြာခဏ binary strings များထဲသို့အချက်အလက်များကိုထုပ်ပိုးရန်မကြာခဏအသုံးပြုလေ့ရှိပြီး Network Contains, ဖိုင်သိုလှောင်မှုနှင့်စာဝှက်ဖြင့်ဒေတာတည်ဆောက်ပုံများကဲ့သို့သောအခြေအနေများတွင်ကျယ်ပြန့်စွာအသုံးပြုသည်။ သို့သော်စီမံကိန်းကြားကာလများသည်ကွဲပြားခြားနားသောဗားရှင်းများ၏အချက်အလက်ပုံစံများပြောင်းလဲသွားနိုင်သည်။ ဤပြ problem နာကိုဖြေရှင်းရန် ဗားရှင်း တစ်ခုစီ၏သဟဇာတဖြစ်သောဗားရှင်းနှင့်ကိုက်ညီမှုနှင့်ကိုက်ညီမှုရှိသောဗားရှင်းနှင့်ကိုက်ညီမှုနှင့်ကိုက်ညီ သော package () ကို ပုံစံအမျိုးမျိုးဖြင့်စီမံခြင်း,
ကျွန်ုပ်တို့တွင် binary data stretion တစ်ခုရှိပြီးနယ်ပယ်တစ်ခုစီတွင်ကိန်းဂဏန်းများ, ရေပေါ်အမှတ်အသားများ, ကြိုးများစသည်တို့ပါ 0 င်သည်။
User_id (4 byte integer)
Timestamp (4 byte integer)
စနစ်အဆင့်မြှင့်တင်မှုများအနေဖြင့်,
ဗားရှင်း 2: user_type (1 byte) ကဆက်ပြောသည်။
ဗားရှင်း 3: is_active (byte boolean value value)
ဗားရှင်းကိုအဆင့်မြှင့်တိုင်းအချိန်တိုင်းမှာဗားရှင်းအဟောင်း၏အချက်အလက်များကိုခြွင်းချက်များသို့မဟုတ်အမှားအယွင်းများကိုမဖတ်ဘဲမှန်ကန်စွာဖော်ထုတ်ပြီးလုပ်ဆောင်လိမ့်မည်ဟုမျှော်လင့်ရသည်။
ကျွန်ုပ်တို့သည်အောက်ပါလုပ်ဆောင်မှုများရှိသော PackFormatManager Class ကိုအကောင်အထည်ဖော်လိုပါသည်။
Multi-version ထုပ်ပိုးပုံစံနှင့်အဓိပ္ပါယ်ကိုထောက်ပံ့သည်။
ဒေတာဗားရှင်းကိုအလိုအလျောက်ဖော်ထုတ်နိုင်ပြီးဖြည်နိုင်သည်။
ထုပ်ပိုးခြင်းနှင့်ထုပ်ပိုးခြင်းအတွက်စည်းလုံးသော interface ကိုပေးရန်,
ဒေတာများ၏နောက်ပြန်လိုက်ဖက်တဲ့နှင့်စကေးနိုင်မှုကိုထောက်ပံ့ပေးသည်;
ကျယ်ပြန့်သောနယ်ပယ်အသစ်များသည်ဗားရှင်းအချက်အလက်ဟောင်း၏အပြောင်းအလဲအတွက်မထိခိုက်ပါ။
<?php
class PackFormatManager
{
private $formats = [];
public function __construct()
{
$this->registerDefaultFormats();
}
private function registerDefaultFormats()
{
$this->formats = [
1 => [
'format' => 'Luser_id/Ltimestamp',
'fields' => ['user_id', 'timestamp'],
],
2 => [
'format' => 'Luser_id/Ltimestamp/Cuser_type',
'fields' => ['user_id', 'timestamp', 'user_type'],
],
3 => [
'format' => 'Luser_id/Ltimestamp/Cuser_type/Cis_active',
'fields' => ['user_id', 'timestamp', 'user_type', 'is_active'],
],
];
}
public function pack(array $data, int $version): string
{
if (!isset($this->formats[$version])) {
throw new InvalidArgumentException("Unsupported format version: $version");
}
$format = $this->formats[$version]['format'];
$values = [];
foreach ($this->formats[$version]['fields'] as $field) {
$values[] = $data[$field] ?? 0;
}
// ဗားရှင်းနံပါတ် header ထည့်ပါ (1 ဒရယ်)
return pack('C', $version) . pack($format, ...$values);
}
public function unpack(string $binary): array
{
// ပထမ ဦး စွာဗားရှင်းနံပါတ် parse
$version = unpack('Cversion', $binary)['version'];
if (!isset($this->formats[$version])) {
throw new InvalidArgumentException("Unsupported format version: $version");
}
$format = $this->formats[$version]['format'];
$fields = $this->formats[$version]['fields'];
// ဗားရှင်း header ကိုဖယ်ရှားပြီးဖြည်ပါ
$data = unpack($format, substr($binary, 1));
return array_merge(['version' => $version], $data);
}
public function getSupportedVersions(): array
{
return array_keys($this->formats);
}
}
$manager = new PackFormatManager();
$data = [
'user_id' => 1001,
'timestamp' => time(),
'user_type' => 2,
'is_active' => 1,
];
$packed = $manager->pack($data, 3);
echo "Packed binary: " . bin2hex($packed) . PHP_EOL;
$unpacked = $manager->unpack($packed);
print_r($unpacked);
သင်ကွက်လပ်အသစ်တစ်ခုကိုထည့်သွင်းလိုပါကဗားရှင်းအသစ်အတွက် format definition ကိုထည့်ပါ။ ဗားရှင်းအဟောင်းများကိုမှန်ကန်စွာဖော်ထုတ်နိုင်ပြီးလုပ်ငန်းများ၌ပြုလုပ်နိုင်သည်။ ဥပမာအားဖြင့်:
$this->formats[4] = [
'format' => 'Luser_id/Ltimestamp/Cuser_type/Cis_active/Llogin_count',
'fields' => ['user_id', 'timestamp', 'user_type', 'is_active', 'login_count'],
];
ကောင်းသောလိုက်ဖက်မှုကိုထိန်းသိမ်းရန် <code> https://m66.net/doct/docs/pack-fforv4.jsol-v4.jsol-v4.json </ code> ကိုသင်လက်ခံနိုင်သည်။
အထုပ် ()) format management Logic ကို encapsulating လုပ်ခြင်းဖြင့်ကျွန်ုပ်တို့သည်ပြောင်းလွယ်ပြင်လွယ်ရှိသောကျယ်ပြန့်သော, ၎င်းသည် Code ထိန်းသိမ်းမှုကိုတိုးတက်စေရုံသာမကစနစ်အဆင့်မြှင့်တင်မှုများနှင့်ဒေတာဇွဲရှိခြင်းအတွက်ခိုင်မာသောအုတ်မြစ်ချသည်။ ဤပုံစံသည် Multi-terminal အပြန်အလှန်ဆက်သွယ်မှုနှင့်ဖိုင်အချက်အလက်များစီးဆင်းမှု၏ဒီဇိုင်းတွင်အထူးအရေးကြီးသည်။