PHP Development တွင် output ကို browser သို့ပို့သောအခါ output ကိုကြားခံယန္တရားကိုမကြာခဏအသုံးပြုလေ့ရှိသည်။ သို့သော်တစ်ခါတစ်ရံတွင်ကျွန်ုပ်တို့သည် ob_list_handlers () function ကိုခေါ်သည့်အခါကျွန်ုပ်တို့သည် "ခေါင်းစီးများကိုပို့ပြီးပြီ" သို့မဟုတ် "buffer stack underflow" ကဲ့သို့သောသာမန်အမှားများကိုကျွန်ုပ်တို့ကြုံတွေ့ရလိမ့်မည်။
ဤဆောင်းပါးသည်သင်ဤအမှားအယွင်းများနှင့်ပြ the နာကိုလျင်မြန်စွာရှာဖွေရန်နှင့်မည်သို့ဖြေရှင်းရမည်ကိုနားလည်ရန်ဤဆောင်းပါးကသင့်အားနားလည်လိမ့်မည်။
ob_list_handlers () သည် PHP built-in function တစ်ခုဖြစ်ပြီးလက်ရှိတက်ကြွသော output buffer handlers များ (handlers) အားလုံးကိုပြန်လည်ပေးအပ်သော PHP built-in function ဖြစ်သည်။ ဥပမာအားဖြင့်, သင်သည် Ob_start () ကြားခံတစ်ခုဖွင့်ရန် Handler ကို stack ထဲသို့တွန်းပို့လိမ့်မည်။
ရိုးရှင်းသောဥပမာ -
<?php
ob_start();
print_r(ob_list_handlers());
ob_end_clean();
?>
output သည်ဆင်တူနိုင်သည်။
Array
(
[0] => default output handler
)
ပြနာဖော်ပြချက်:
အကယ်. သင်သည် OB_CRCLEAN သို့မဟုတ် OB_CLEAN သို့မဟုတ် ob_clean () ကို အကြိမ်ပေါင်းများစွာပြုလုပ်ပါက, သို့သော်၎င်းတွင်ကြားခံများစွာမရှိသေးပါ။
Warning: ob_end_clean(): failed to delete buffer. No buffer to delete
အကြောင်းရင်းကိုဖြစ်ပေါ်စေသည်
ဘာဖြစ်လို့လဲဆိုတော့ကြားခံ stack သည်ဗလာကျင်းပြီးမလိုအပ်သောသန့်ရှင်းရေးလုပ်ငန်းကိုခေါ်သောကြောင့်ဖြစ်သည်။
Quick Fix:
သန့်ရှင်းရေးကိုမခေါ်မီကြားခံရှိမတည်မနေကိုစစ်ဆေးနိုင်သည်။
<?php
if (ob_get_level() > 0) {
ob_end_clean();
}
?>
သို့မဟုတ်ထိုထက်မကကြော့လျှော်နေပြီးလုံခြုံစိတ်ချရသောလုပ်ဆောင်မှုကို oncapsult
<?php
function safeObEndClean() {
while (ob_get_level() > 0) {
ob_end_clean();
}
}
?>
ပြနာဖော်ပြချက်:
ခေါင်းစီးကိုမသတ်မှတ်မီ ( header ('တည်နေရာ) - https://gitbox.net/success) ),
Warning: Cannot modify header information - headers already sent
အကြောင်းရင်းကိုဖြစ်ပေါ်စေသည်
ဘာဖြစ်လို့လဲဆိုတော့ output (အာကာသသို့မဟုတ်မမြင်ရတဲ့ဇာတ်ကောင်တောင်မှ) ထွက်ပေါ်လာပြီးတဲ့အခါ PHP က http response ကိုစပို့လိုက်ပြီလို့ထင်ပြီးဒီအချိန်တုန်းက setting header အချက်အလက်တွေကမမှန်ကန်ဘူးလို့ထင်လိမ့်မယ်။
Quick Fix:
PHP ဖိုင်၏အစတွင် နေရာလွတ်သို့မဟုတ် output လုံးဝမရှိကြောင်း သေချာပါစေ။
output buffering ကိုစတင်ပါ။ အဆုံးမှာယူနီဖောင်းပို့ပါ။
ဥပမာအားဖြင့်:
<?php
ob_start();
// ပုံမှန်ယုတ္တိဗေဒအပြောင်းအလဲနဲ့
header('Location: https://gitbox.net/welcome');
exit;
ob_end_flush();
?>
မှတ်ချက် - နောက်ဆက်တွဲကုဒ်ကွပ်မျက်မှုကိုရှောင်ရှားရန် redirection ပြီးနောက် ထွက်ရန် လိုအပ်သည်။
ပြနာဖော်ပြချက်:
ob_start ('uneffandler' ကို အသုံးပြုသောအခါ - မတည်ရှိသော handler ကိုသတ်မှတ်လျှင် PHP သည်အမှားတစ်ခုသို့တင်ပြလိမ့်မည်။
Warning: ob_start(): output handler 'unknown_handler' cannot be used
အကြောင်းရင်းကိုဖြစ်ပေါ်စေသည်
Handler Name ကို PHP (Ob_gzhandler Gzip Compression အတွက် ob_gzhandler ) ကိုလူသိများရမည်။
Quick Fix:
ပရိုဆက်ဆာသည်တည်ရှိပြီးပြန်လည်မှတ်ပုံတင်ခြင်းရှိမရှိအတည်ပြုပါ။
<?php
if (function_exists('ob_gzhandler')) {
ob_start('ob_gzhandler');
} else {
ob_start();
}
?>
ရှုပ်ထွေးသောစာမျက်နှာတစ်ခုကြုံတွေ့ရသောအခါကြားခံခြင်းကိုအကြိမ်ကြိမ်ဖွင့ ်. ပိတ်ထားသည့်အခါ Ob_list_Handlers () ကိုသုံးနိုင်သည်။
ဥပမာ -
<?php
ob_start('ob_gzhandler');
ob_start();
print_r(ob_list_handlers());
ob_end_flush();
ob_end_flush();
?>
ထုတ်လုပ်မှု -
Array
(
[0] => ob_gzhandler
[1] => default output handler
)
စိတ်ရှုပ်ထွေးမှုများကိုရှောင်ရှားရန် stack order အရ _ * * () ခေါ်ဆိုမှုများကိုပြုလုပ်ပါ။
Ob_list_Handlers များ နှင့်ဆက်စပ်သောအမှားများကိုကျွန်ုပ်တွေ့ကြုံခဲ့ရသည်။ ob_get_level () obget_level () obget_level () output buffer ကိုစစ်ဆေးရန်ဤပြ problem နာကိုမှန်ကန်စွာရှောင်ရှားနိုင်သည်။ Debugging Ob_list_handlers () ကိုအသုံးပြုပြီး buffer stack အခြေအနေကိုလေ့လာရန် () ကိုကြည့်ရှုရန် () ကိုကြည့်ရှုရန်အချိန်မှန်ကိုကြည့်ရှုရန်အချိန်မှန်တွင်ပြ problems နာများအတွက်အစွမ်းထက်သောကိရိယာတစ်ခုဖြစ်သည်။