လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> ကွဲပြားခြားနားသောဗားရှင်းများအကြားဒေတာသဟဇာတဖြစ်အောင်ဗားရှင်းနှင့်ကိုက်ညီမှုရှိစေရန် PHP Pack () function data format စီမံခန့်ခွဲမှုကိရိယာအတန်းကိုဘယ်လိုရေးမလဲ။

ကွဲပြားခြားနားသောဗားရှင်းများအကြားဒေတာသဟဇာတဖြစ်အောင်ဗားရှင်းနှင့်ကိုက်ညီမှုရှိစေရန် PHP Pack () function data format စီမံခန့်ခွဲမှုကိရိယာအတန်းကိုဘယ်လိုရေးမလဲ။

M66 2025-06-04

PHP Development တွင် PHP () function ကိုမကြာခဏ binary strings များထဲသို့အချက်အလက်များကိုထုပ်ပိုးရန်မကြာခဏအသုံးပြုလေ့ရှိပြီး Network Contains, ဖိုင်သိုလှောင်မှုနှင့်စာဝှက်ဖြင့်ဒေတာတည်ဆောက်ပုံများကဲ့သို့သောအခြေအနေများတွင်ကျယ်ပြန့်စွာအသုံးပြုသည်။ သို့သော်စီမံကိန်းကြားကာလများသည်ကွဲပြားခြားနားသောဗားရှင်းများ၏အချက်အလက်ပုံစံများပြောင်းလဲသွားနိုင်သည်။ ဤပြ problem နာကိုဖြေရှင်းရန် ဗားရှင်း တစ်ခုစီ၏သဟဇာတဖြစ်သောဗားရှင်းနှင့်ကိုက်ညီမှုနှင့်ကိုက်ညီမှုရှိသောဗားရှင်းနှင့်ကိုက်ညီမှုနှင့်ကိုက်ညီ သော package () ကို ပုံစံအမျိုးမျိုးဖြင့်စီမံခြင်း,

1 ။ လိုအပ်ချက်နောက်ခံခွဲခြမ်းစိတ်ဖြာခြင်း

ကျွန်ုပ်တို့တွင် 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)

ဗားရှင်းကိုအဆင့်မြှင့်တိုင်းအချိန်တိုင်းမှာဗားရှင်းအဟောင်း၏အချက်အလက်များကိုခြွင်းချက်များသို့မဟုတ်အမှားအယွင်းများကိုမဖတ်ဘဲမှန်ကန်စွာဖော်ထုတ်ပြီးလုပ်ဆောင်လိမ့်မည်ဟုမျှော်လင့်ရသည်။

2 ။ ကိရိယာဒီဇိုင်းရည်ရွယ်ချက်များ

ကျွန်ုပ်တို့သည်အောက်ပါလုပ်ဆောင်မှုများရှိသော PackFormatManager Class ကိုအကောင်အထည်ဖော်လိုပါသည်။

  1. Multi-version ထုပ်ပိုးပုံစံနှင့်အဓိပ္ပါယ်ကိုထောက်ပံ့သည်။

  2. ဒေတာဗားရှင်းကိုအလိုအလျောက်ဖော်ထုတ်နိုင်ပြီးဖြည်နိုင်သည်။

  3. ထုပ်ပိုးခြင်းနှင့်ထုပ်ပိုးခြင်းအတွက်စည်းလုံးသော interface ကိုပေးရန်,

  4. ဒေတာများ၏နောက်ပြန်လိုက်ဖက်တဲ့နှင့်စကေးနိုင်မှုကိုထောက်ပံ့ပေးသည်;

  5. ကျယ်ပြန့်သောနယ်ပယ်အသစ်များသည်ဗားရှင်းအချက်အလက်ဟောင်း၏အပြောင်းအလဲအတွက်မထိခိုက်ပါ။

3 ။ ကုဒ်အကောင်အထည်ဖော်မှု

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

4 ။ ဥပမာများကိုသုံးပါ

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

5 ။ ဗားရှင်း extension နှင့်လိုက်ဖက်တဲ့အပြောင်းအလဲနဲ့အကြံပြုချက်များ

သင်ကွက်လပ်အသစ်တစ်ခုကိုထည့်သွင်းလိုပါကဗားရှင်းအသစ်အတွက် 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> ကိုသင်လက်ခံနိုင်သည်။

6 ။ အကျဉ်းချုပ်

အထုပ် ()) format management Logic ကို encapsulating လုပ်ခြင်းဖြင့်ကျွန်ုပ်တို့သည်ပြောင်းလွယ်ပြင်လွယ်ရှိသောကျယ်ပြန့်သော, ၎င်းသည် Code ထိန်းသိမ်းမှုကိုတိုးတက်စေရုံသာမကစနစ်အဆင့်မြှင့်တင်မှုများနှင့်ဒေတာဇွဲရှိခြင်းအတွက်ခိုင်မာသောအုတ်မြစ်ချသည်။ ဤပုံစံသည် Multi-terminal အပြန်အလှန်ဆက်သွယ်မှုနှင့်ဖိုင်အချက်အလက်များစီးဆင်းမှု၏ဒီဇိုင်းတွင်အထူးအရေးကြီးသည်။