လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> ob_list_handlers အတွက် Handler ပ conflicts ိပက်ခများကြုံတွေ့နေရပုံကိုရှောင်ရှားရန်

ob_list_handlers အတွက် Handler ပ conflicts ိပက်ခများကြုံတွေ့နေရပုံကိုရှောင်ရှားရန်

gitbox 2025-05-20

PHP တွင် output buffering သည် developer များမှာ developer များမှာ developer များကအချက်အလက်များကို browser မှထုတ်ယူခြင်းမပြုမီမှတ်ဉာဏ်တွင်သိမ်းဆည်းရန်ခွင့်ပြုသည့်ယန္တရားတစ်ခုဖြစ်သည်။ ဤသည် output ကိုပြုပြင်မွမ်းမံရန်, ချုံ့ခြင်းသို့မဟုတ်စစ်ထုတ်ရန်လိုအပ်သည့်အခါအထူးသဖြင့်အသုံးဝင်သည်။ သို့သော် output buffer handlers များကိုအသုံးပြုသောအခါ ( Ob_start ) မှမှတ်ပုံတင်ထားသောဖုန်းနံပါတ်များ) တွင် developer များကပြ a နာတစ်ခုနှင့်မကြာခဏကြုံတွေ့ရလေ့ရှိသည်။

Buffer Handlers အကြားရှိပ conflicts ိပက်ခများအကြားပ conflicts ိပက်ခများကိုရှောင်ရှားရန်နှင့်ဖြေရှင်းရန်မည်သို့ရှောင်ရှားနိုင်မည်ကိုခွဲခြားသိမြင်ရန်ဤဆောင်းပါးသည် အတိမ်အနက်ကိုနက်ရှိုင်းစွာရှင်းပြပါမည်။

1 ။ output ကိုကြားခံ၏အခြေခံနိယာမ

PHP ၏ output buffer ကို ob_start () မှတဆင့်ဖွင့်ထားသည်။ ကြားခံကိုပိတ်ထားသည့်အခါ ( OB_END_FLUSH () ) ဟုခေါ်သည့်အခါ (ထိုကဲ့သို့သော) ကိုမှတ်ပုံတင်ထားသောပရိုဆက်ဆာအရအကြောင်းအရာများကိုထုတ်လုပ်ပြီးထုတ်လုပ်မှုကိုပြုလုပ်လိမ့်မည်။

 ob_start(); // Processor-free buffer ကိုဖွင့်ပါ
echo "Hello, world!";
$content = ob_get_clean(); // ကြားခံအကြောင်းအရာကိုရယူပါနှင့်ကြားခံပယ်ပိတ်ပါ

Buffer အကြောင်းအရာကိုလုပ်ဆောင်ရန် processing function တစ်ခုတွင်လည်းအောက်ပါအတိုင်းပြုလုပ်နိုင်သည်။

 function compress_output($buffer) {
    return gzencode($buffer);
}

ob_start("compress_output");
echo "This is the original content.";
ob_end_flush();

2 ။ ob_list_handlers ၏အခန်းကဏ်။

ပရိုဂရမ်တွင် ob_start () ကို အကြိမ်ပေါင်းများစွာအသုံးပြုသောအခါမည်သည့်ပရိုဆက်ဆာသည်လက်ရှိတွင်မည်သည့်ပရိုဆက်ဆာများစတင်နေကြသနည်းမသိရသေးပါ။ ob_list_handlers () သည်လက်ရှိကြားခံကိုင်တွယ်သူအားလုံးကိုကြည့်ရှုရန်အသုံးပြုသောကိရိယာတစ်ခုဖြစ်သည်။

 ob_start("strtoupper");
ob_start("urlencode");
print_r(ob_list_handlers());

output ကိုဆင်တူသည် -

 Array
(
    [0] => urlencode
    [1] => strtoupper
)

Ob_list_Handlers () ၏ပြန်လာရလဒ်ကို "stack" ၏အမိန့်ကိုစီစဉ်ထားကြောင်းသတိပြုသင့်သည်။

3 ။ ဘုံပ conflict ိပက်ခအခြေအနေများနှင့်ဖြေရှင်းနည်းများ

1 ။ တူညီသောပရိုဆက်ဆာကိုပြန်လုပ်ပါ

အကယ်. သင်သည် OB_START (OB_GZHandler ") အတွက်တူညီသော processor ကိုနေရာများစွာတွင်ထပ်တူသုံးပါက,

ဖြေရှင်းချက် -

Processor ကိုမှတ်ပုံတင်ခြင်းမပြုမီရှိပြီးသားရှိမရှိဆုံးဖြတ်ပါ။

 if (!in_array('ob_gzhandler', ob_list_handlers())) {
    ob_start('ob_gzhandler');
}

2 ။ ထည့်သွင်းထားသောပရိုဆက်ဆာများကိုအလယ်အလတ်အလွှာတွင်မိတ်ဆက်သည်

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

နမူနာမေးခွန်း Code:

 ob_start("custom_handler"); // သင်၏စိတ်ကြိုက်ပရိုဆက်ဆာ
// တစ်ချိန်တည်းမှာမူဘောင်အတွင်း၌ထည့်သွင်းခဲ့သည် ob_gzhandler

၎င်းသည်အမှိုက်သရိုက်များသို့မဟုတ် http header ပ conflict ိပက်ခများဖြစ်ပေါ်နိုင်သည်။

ဖြေရှင်းချက် -

Output Buffer Startup Logic ၏စည်းလုံးမှုစီမံခန့်ခွဲမှုစီမံခန့်ခွဲမှု, entry file သို့မဟုတ် scraination script တွင်တရားစီရင်ချက်ထည့်ပါ။

 function safe_ob_start($handler) {
    if (!in_array($handler, ob_list_handlers())) {
        ob_start($handler);
    }
}

3 ။ အဆိုပါ buffer မှန်ကန်စွာသန့်ရှင်းစွာမသန့်ရှင်းပါဘူး, ပုံမှန်မဟုတ်သော output ကိုဖြစ်ပေါ်စေသည်

Ob_end_Flush () သို့မဟုတ် ob_clean () ကို မှန်ကန်သောအစဉ်အဆက်ဟုမခေါ်ပါကပရိုဆက်ဆာမျိုးစုံကိုမှတ်ပုံတင်ပြီးပါကပရိုဆက်ဆာကိုမှန်ကန်စွာလုပ်ဆောင်ရန်အတွက်ပရိုဆက်ဆာကိုဖြစ်စေနိုင်သည်။

အကောင်းဆုံးအလေ့အကျင့်: စည်းလုံးညီညွတ်သောကြားခံ stack စီမံခန့်ခွဲမှု

 function clear_all_buffers() {
    while (ob_get_level() > 0) {
        ob_end_clean();
    }
}

Buffer အားလုံးသန့်ရှင်းရေးလုပ်ရန်လိုအပ်သည့်ကြားခံအားလုံးကိုအတင်းအကျပ်ခိုင်းစေရန်လိုအပ်သည့်အတွက်ဤ function ကိုခေါ်ပါ။

4 ။ ဥပမာအားပြည့်စုံသောဥပမာ - လုံခြုံစိတ်ချရသောမှတ်ပုံတင်ခြင်း outputor processor

 function register_output_handler($handler) {
    if (!in_array($handler, ob_list_handlers())) {
        ob_start($handler);
    } else {
        error_log("ပရိုဆဲှသူ $handler မှတ်ပုံတင်ထားပါသည်,ခုန်ကျော်သည်。");
    }
}

// အကြောင်းအရာ compressed နှင့်အစားထိုးခံရဖို့လိုအပ်ကြောင်းယူဆ
function replace_and_compress($buffer) {
    $buffer = str_replace("example.com", "gitbox.net", $buffer);
    return gzencode($buffer);
}

// 注册ပရိုဆဲှသူ
register_output_handler("replace_and_compress");

echo "အလည်အပတ်ခရီးမှလှိုက်လှဲစွာကြိုဆိုပါသည်:https://example.com/page";

// နောက်ဆုံး output ကိုအကြောင်းအရာ
ob_end_flush();

V. နိဂုံးချုပ်

ရှုပ်ထွေးသော PHP applications များတွင် module များသို့မဟုတ်စာကြည့်တိုက်များစွာသည်တစ်ချိန်တည်းတွင် output buffer processor များကိုတစ်ချိန်တည်းတွင် သုံး. ပ conflicts ိပက်ခများသည်မလျော်ကန်သောစီမံခန့်ခွဲမှုအပေါ်တွင်ကျရောက်နေသည်။ ob_list_handlers () တွင်လက်ရှိမှတ်ပုံတင်ထားသောပရိုဆက်ဆာကိုကျွန်ုပ်တို့ရှင်းရှင်းလင်းလင်းတွေ့မြင်နိုင်သည်။

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