PHP ၏ Serialize နှင့် unserialize လုပ်ဆောင်ချက်များကိုအသုံးပြုသောအခါ developer များက "မတောင်းဆိုနိုင်" သောအမှားများကိုကြုံတွေ့ရနိုင်သည်။ ဤအမှားသည်များသောအားဖြင့် PHP သည်အရာဝတ်ထုတစ်ခုသို့မဟုတ်ခင်းကျင်းမှုတစ်ခုသို့ string ကိုအောင်မြင်စွာမနေနိုင်ကြောင်းဖော်ပြသည်။ ဤဆောင်းပါးသည်ဘုံအကြောင်းပြချက်အချို့နှင့်ဤပြ problem နာကိုမည်သို့ဖြေရှင်းရမည်ကိုဖော်ပြလိမ့်မည်။
Serialize function သည် PHP ဒေတာတည်ဆောက်ပုံ ( ဥပမာအား ဖြင့်အရာဝတ်ထုတစ်ခုသို့မဟုတ်ခင်းကျင်းမှုကဲ့သို့သော) string တစ်ခုအဖြစ်ပြောင်းလဲနိုင်သည်။ သို့သော်အချို့သောကိစ္စရပ်များတွင်မူ များကို ခေါ်ဆိုသည့်အခါအောက်ပါတို့နှင့်ဆင်တူသောအမှားများကိုသင်ကြုံတွေ့ရနိုင်သည် -
Warning: unserialize(): Error at offset 0 of 2 bytes in /path/to/script.php on line 20
Cannot unserialize
ဤအမှားသည်များသောအားဖြင့်အောက်ပါအကြောင်းပြချက်များကြောင့်ဖြစ်ပေါ်လေ့ရှိသည်။
အသုံးအများဆုံးအကြောင်းပြချက်များထဲမှတစ်ခုမှာ Serialized data data များကိုအနှောင့်အယှက်ဖြစ်စေနိုင်သည်။ ၎င်းကို URL တစ်ခုသို့မဟုတ်ဒေတာဘေ့စ်မှတစ်ဆင့်ဒေတာများကိုသိုလှောင်သည့်အခါသို့လွှဲပြောင်းခြင်းကာလအတွင်းဖြစ်နိုင်သည်။ အကယ်. serialized data များကိုမှားယွင်းစွာပြုပြင်မွမ်းမံပါက unserialize သည် မူရင်းဖွဲ့စည်းပုံကိုမယူမှတ်နိုင်ပါ။
ဖြေရှင်းချက် -
သိုလှောင်ခြင်းနှင့်ထုတ်လွှင့်စဉ်အတွင်း serialized ဒေတာများကိုအကျင့်ပျက်ခြစားမှုသို့မဟုတ်ပြုပြင်မွမ်းမံရန်သေချာစေပါ။ အကယ်. သင်သည် URL parameters များကို အသုံးပြု. Serialized data များကိုဖြတ်သန်းပါကအချက်အလက်အပြောင်းအလဲများဖြစ်ပေါ်စေသည့်အထူးအက္ခရာများ (ဥပမာ - = ) ,
အကယ်. URL မှတစ်ဆင့် Serialized data များကိုဖြတ်သန်းပါက urlencode string ကို encode လုပ်ရန် urloyenode ကို သုံးပါ။
// လွှဲပြောင်းမီအသုံးပြုပါ urlencode ကုဒ်
$serialized_data = urlencode(serialize($data));
// လက်ခံပြီးနောက် decode နှင့် deserialize
$data = unserialize(urldecode($serialized_data));
အကယ်. serialized အရာဝတ်ထုတွင်အတန်းတစ်ခုပါ 0 င်ပါက deserialization အတွင်းအတန်းကိုမတွေ့ရှိနိုင်ပါက PHP သည် "unsialize" အမှားကိုပစ်ချလိမ့်မည်။ ဥပမာအားဖြင့်၎င်းသည်အတန်း၏ဖိုင်သည်မှန်ကန်စွာမပါ 0 င်ပါ။ သို့မဟုတ်အတန်းအစား၏အမည်ပြောင်းလဲသွားသည်။
ဖြေရှင်းချက် -
အထူးသဖြင့်အရာဝတ်ထုများကိုအသုံးပြုသောအခါလိုအပ်သောအတန်းများအားလုံးကိုမှန်ကန်စွာဖွင့်ထားကြောင်းသေချာပါစေ။ Class Files spl_autoload_register ကိုသုံးပြီးအလိုအလျောက်တင်နိုင်သည်။
အကယ်. အတန်းကိုအမည်ပြောင်းခြင်းသို့မဟုတ်ဖယ်ရှားခြင်းခံရပါက class name သည် deserialization စဉ်အတွင်းတသမတ်တည်းရှိနေသည်ဟုသေချာစေရန် Serialized အချက်အလက်များ၏ဗားရှင်းနှင့်ဖွဲ့စည်းပုံကိုစစ်ဆေးပါ။
// အလိုအလျှောက်အတန်းကို load
spl_autoload_register(function ($class) {
include 'path/to/classes/' . $class . '.php';
});
အကယ်. serialized data များကို PHP ဗားရှင်းများအကြားလွှဲပြောင်းပါက PHP ဗားရှင်းအချို့အကြားသဟဇာတမဖြစ်နိုင်ပါ။ အထူးသဖြင့် PHP 7 နှင့် PHP 8 သည်အရာဝတ်ထု Serialization တွင်ပြုပြင်ပြောင်းလဲမှုအချို့ပြုလုပ်ခဲ့သည့်အပြင် Deserialization ပျက်ကွက်စေနိုင်သည်။
ဖြေရှင်းချက် -
PHP ဗားရှင်းများသည် runtime ပတ်ဝန်းကျင်အားလုံးတွင်တသမတ်တည်းဖြစ်ကြောင်းသေချာပါစေသို့မဟုတ် deserialization မတိုင်မီဒေတာများကိုသင့်တော်သောအချက်အလက်များကိုထည့်သွင်းစဉ်းစားပါ (ဥပမာ, သဟဇာတပုံစံသို့ပြောင်းလဲခြင်း)
PHP ဗားရှင်းကိုသင်မထိန်းချုပ်နိုင်ပါက serialization အစား JSON format ကိုသုံးနိုင်သည်။
// အသုံးပြု JSON ရေှးယူနိုင်ခြင်း serialize
$json_data = json_encode($data);
// အသုံးပြု json_decode ရေှးယူနိုင်ခြင်း unserialize
$data = json_decode($json_data, true);
အကယ်. သင်သည်မတူညီသောဇာတ်ကောင် encoding system များအကြား Serialized data များကိုပေးပို့ပါက, ၎င်းသည်များသောအားဖြင့်အချက်အလက်များကိုမှန်ကန်စွာဖြည့်ဆည်းရန်ပျက်ကွက်ခြင်းသည် မအောင်မြင်သော ကြောင့်ဖြစ်သည်။
ဖြေရှင်းချက် -
အချက်အလက်များ၏အက်ခရာသင်္ကေတသည်အထူးသဖြင့်ဒေတာများကိုလွှဲပြောင်းသောအခါတသမတ်တည်းဖြစ်ကြောင်းသေချာပါစေ။ encoding ပြ problems နာများကိုရှောင်ရှားရန်အချက်အလက်များကိုသိုလှောင်သည့်အခါစည်းလုံးညီညွတ်သောအက္ခရာများ (UTF-8 ကဲ့သို့) ကိုသုံးနိုင်သည်။
// 设置字符ကုဒ်为 UTF-8
mb_internal_encoding("UTF-8");
အကယ်. Serialized Object တွင် PHP အရင်းအမြစ်အမျိုးအစား (ဥပမာဒေတာဘေ့စ်ဆက်သွယ်မှုစသည်တို့, ဖိုင်များ, ဖိုင်များစသည်တို့) ပါ 0 င်ပါကဤအရင်းအမြစ်များကို deserialization စဉ်အတွင်းပြန်လည်တည်ဆောက်ခြင်းမပြုနိုင်ပါ။
ဖြေရှင်းချက် -
အရာဝတ်ထုကိုမ 0 င်မီအရာဝတ်ထုမှအရင်းအမြစ်အဖွဲ့ဝင်များကိုဖယ်ရှားရန်သို့မဟုတ် __SEEEP နှင့် __WAKUP နည်းလမ်းများကိုအကောင်အထည်ဖော်ရန်သေချာစေပါ။
class MyClass {
private $file;
public function __sleep() {
// Serialization မတိုင်မီအရင်းအမြစ်များကိုဖယ်ရှားပါ
unset($this->file);
return ['file']; // serialized ခံရဖို့လိုအပ်တဲ့ attribute တွေကိုပြန်ပို့သည်
}
public function __wakeup() {
// deserialization ပြီးနောက်အရင်းအမြစ် reopen
$this->file = fopen('path/to/file', 'r');
}
}
သင် "unserialize" အမှားတစ်ခုကိုသင်ကြုံတွေ့ရသောအခါပြ the နာကိုဖြေရှင်းရန်သင် debugging နည်းစနစ်များကိုသုံးနိုင်သည်။
Serial Data ၏သမာဓိကိုစစ်ဆေးပါ။ ၎င်းသည်ပြီးပြည့်စုံစွာကြည့်ရှုခြင်းမဟုတ်ဘဲသေချာစေရန် serialized string ကို output လုပ်ပါ။
ဖြစ်နိုင်ချေရှိသောအချက်များအားကြည့်ရှုရန်အသေးစိတ်အမှားအယွင်းများကိုကြည့်ရှုရန် အမှားအမှားအယွင်းများကိုဖွင့်ရန် အမှားအယွင်းများ (E_ALTS) နှင့် ini_set (says]) ကို အသုံးပြုပါ။
Var_Dump ဖြင့်ဒေတာများကိုစစ်ဆေးပါ။ deferialization မတိုင်မီ deserialization မလုပ်မီမျှော်လင့်ချက်များနှင့်ကိုက်ညီစေရန်အချက်အလက်များ၏ပုံစံနှင့်အကြောင်းအရာကိုစစ်ဆေးရန် Var_Dump ကို သုံးပါ။
var_dump($serialized_data);
"မပို့နိုင်" သောအမှားများကိုအ များအား ဖြင့်မအောင်မြင်သောအမှားများ, PHP ဗားရှင်း၏သဟဇာတမတူသော, ဤပြ problem နာကိုများသောအားဖြင့်ဤပြ problem နာများကိုစစ်ဆေးပြီးတစ် ဦး ချင်းစီအားဖြင့်တစ် ဦး နှင့်သက်ဆိုင်သောဖြေရှင်းနည်းများကိုယူဆောင်လာသည့်အားဖြင့်ဖြေရှင်းနိုင်သည်။ အကယ်. အခြေအနေများအခွင့်အလမ်းများပါ 0 င်ပါကအထူးသဖြင့်လိုက်လျောညီထွေရှိသောပြ issues နာအချို့ကိုရှောင်ရှားနိုင်သည့် serialization နှင့် deserialization အစား JSON ကိုအသုံးပြုရန်စဉ်းစားပါ။