PHP Output Control (Output Buffering) အကြောင်း သိကောင်းစရာများ

Output Control (or) Output Buffering ဆိုတာဘာလဲ?

                Output Control ဆိုတာ PHP ရဲ့ အရေးပါတဲ့ Feature တစ်ခု ဖြစ်ပါတယ်။ Output Control ကို အများအားဖြင့်  Output Buffering လို့ လူသိများပါတယ်။ PHP Script တွေက ထွက်လာတဲ့ HTML တွေကို စုထားပေးပြီး လိုအပ်တဲ့အချိန်မှ အပြင်ကို ထုတ်ပေးနိုင်ဖို့ ကူညီပေးတဲ့ Feature တစ်ခု ဖြစ်ပါတယ်။ 

                ပုံမှန်အတိုင်းဆိုရင် PHP Script က ထွက်လာတဲ့ HTML တွေကို တစ်ခုထွက် တစ်ခုပြတဲ့ စနစ်ကို သုံးပါတယ်။ Output Buffering ကို သုံးမယ်ဆိုရင်တော့ အဲဒီလို မဟုတ်တော့ပဲ အားလုံးစုပြီးမှ ထုတ်ပြတာမျိုးလုပ်လို့ရပါတယ်။ အဲဒီအပြင် Output Buffering ဟာ header() တို့ setcookie() တို့က ထွက်လာတဲ့ ရလဒ်တွေကိုလဲ မထိခိုက်စေနိုင်ပါဘူး။ Script က ထုတ်ပေးလိုက်တဲ့ HTML တွေကို မပို့ခင် header() တို့ setcookie() တို့ကို အရင်ပို့ချင်တဲ့အခါမှာ အများကြီး အသုံးဝင်ပါတယ်။

Output Control ရဲ့ အားသာချက်များ

  1. Output Control ရဲ့ အဓိကအားသာချက်ကတော့ PHP Script က ထွက်လာတဲ့ HTML တွေကို စုထားပေးနိုင်တာပါ။ အဲဒီလို စုထားပေးတဲ့အပြင် header() တို့၊ setcookie() တို့ကိုလဲ မထိခိုက်တဲ့အတွက် HTML တွေ မပို့ခင်မှာ အရင်ဆုံး header() နဲ့ setcookie() တွေ အရင်လုပ်လို့ ရတာပါပဲ။
  2. နောက်ထပ် အားသာချက်တစ်ခုကတော့ Browser အနေနဲ့ Download ချရတဲ့ အကြိမ်အရေအတွက် လျော့ကျသွားတဲ့အတွက် Download Bandwidth ကိုလဲ လျော့ချနိုင်ပါတယ်။
  3. နောက်ထပ် အားသာချက်တစ်ခုကတော့ Modularization (သက်ဆိုင်ရာကဏ္ဍအလိုက် ခွဲခြားနိုင်ခြင်း) လုပ်လို့ရတာပါ။ ဘယ်အပိုင်းကို အရင် Buffer ထဲထည့်၊ ပြီးရင် နောက်အပိုင်းတစ်ခုကို Buffer ထဲ ပေါင်းစသည်ဖြင့် HTML တွေကို စိတ်ကြိုက် ပြုပြင်လို့ရတာပါ။ 
  4. နောက်ဆုံး၊ အရေးအကြီးဆုံး အားသာချက်ကတော့ Output Buffering သုံးထားရင် “Warning: Cannot modify header information - headers already send by (output)” ဆိုတဲ့ Error မတက်တော့ပါဘူး။

Output Buffering ကို စမ်းသပ်ကြည့်ရအောင်

                Output Buffering ကို စချင်တယ်ဆိုရင် ob_start() ဆိုပြီး စပေးရပါတယ်။ အဲဒီအချိန်က စပြီး echo သုံးပြီး ရိုက်ထုတ်တာ မှန်သမျှ အကုန်သိမ်းပါလိမ့်မယ်။ ob_end_flush() ဆိုတာကတော့ output buffering ထဲမှာ မှတ်ထားသမျှ အကုန် ထုတ်ပြလိုက်တော့လို့ ခိုင်းလိုက်တာပါ။ setcookie() ကို မထိတဲ့အတွက် setcookie() ကို ခိုင်းစေတဲ့ အစီအစဉ်အတိုင်း လုပ်သွားပါလိမ့်မယ်။

<?php
ob_start();
echo "Hello World <br>";
setcookie("test", 'testcookie');
echo "How are you my friend! <br>";
ob_end_flush();
?>
view raw index.php hosted with ❤ by GitHub

ob_start() callback

                ob_start() callback ဆိုတာ output buffering စတင်ချိန်မှာ သတ်မှတ်ပေးထားရပြီး output buffer ကို clean သို့မဟုတ် flush လုပ်လိုက်တဲ့အချိန်မှာ ခေါ်ပါတယ်။ string အဖြစ် လှမ်းယူပြီး string အဖြစ် return ပြန်ပေးပါတယ်။ ကျွန်တော်တို့ လက်တွေ့စမ်းသပ်ကြည့်ရအောင်

<?php
function testFuncOne($buffer) {
return (str_replace("Apple", "Orange", $buffer));
}
ob_start("testFuncOne");
echo "Hello Apple <br>";
echo "How are you my Apple! <br>";
echo "Another, How are you? <br>";
echo "Testing One Apple Three <br>";
ob_end_flush();
?>
view raw index.php hosted with ❤ by GitHub

                ကျွန်တော် ရေးထားတဲ့ Program မှာ testFuncOne($buffer) ဆိုတဲ့ function ရှိပါတယ်။ အဲဒီ function ရဲ့ အဓိက လုပ်ဆောင်ချက်က Apple ဆိုတာတွေ ရှာပြီး Orange နဲ့ အစားထိုးတာပါ။ ob_start(“testFuncOne”) ဆိုပြီး သတ်မှတ်ထားတဲ့အတွက် output buffering ရဲ့ အဆုံးမှာ (flush လုပ်လိုက်တာဖြစ်ဖြစ် clean လုပ်လိုက်တာ ဖြစ်ဖြစ်) callback အနေနဲ့ လှမ်းခေါ်ဖို့ သတ်မှတ်လိုက်တာပါ။ ကျွန်တော်တို့ echo တွေ ရိုက်ထားတဲ့အချိန်က Apple ဆိုတာတွေ သုံးခုလောက် ပါပါတယ်။ ဒါပေမယ့် script ကို run ကြည့်တဲ့အခါမှာ အောက်ကပုံမှာ ပြထားတဲ့အတိုင်းပဲ Apple နေရာမှာ Orange တွေ အစားထိုးသွားတာ တွေ့ရပါလိမ့်မယ်။ 


ob_start with ob_gzhandler

                ob_start() မှာ မိမိစိတ်ကြိုက် function ကို လှမ်းခေါ်လို့ ရသလို built-in function တစ်ခု ဖြစ်တဲ့ ob_gzhandler ကိုလဲ လှမ်းခေါ်လို့ရပါတယ်။ အဓိက အားဖြင့် output တွေကို gzip နဲ့ compress (ချုံ့) လိုက်ဖို့ ဖြစ်ပါတယ်။ ဒီနေရာမှာ တစ်ခု သတိထားဖို့ လိုအပ်တာ ob_gzhandler ကို သုံးမယ်ဆိုရင် php မှာ zlib ဆိုတဲ့ extension တစ်ခု ထည့်သွင်းဖိို့ လိုအပ်မှာ ဖြစ်ပါတယ်။ gzip နဲ့ ပို့လိုက်တဲ့အတွက် html file size ကို အတော်အတန် သေးသွားစေပါတယ်။ အဲဒီအတွက် browser က downlaod ချတဲ့အခါ အများကြီး သက်သာသွားပါလိမ့်မယ်။ gzip နဲ့ compress လုပ်ပြီး ပို့လိုက်တာက browser က အလိုလိုသိပြီး ပုံမှန် HTML ဖြစ်အောင် ဖြည်လိုက်ပါလိမ့်မယ်။

<?php
ob_start("ob_gzhandler");
echo "Hello Apple <br>";
echo "How are you my Apple! <br>";
echo "Another, How are you? <br>";
echo "Testing One Apple Three <br>";
ob_end_flush();
?>
view raw index.php hosted with ❤ by GitHub

ob_start with ob_get_contents

                ob_get_contents() ဆိုတာ အပိုင်းလိုက် အပိုင်းလိုက် output buffering ထဲ ထည့်လိုက်တာကို ပြန်ထုတ်တဲ့ နေရာမှာ သုံးပါတယ်။ နမူနာအနေနဲ့ စမ်းကြည့်ရအောင်

<?php
ob_start();
echo "How are you and where do you live? ";
echo "I live in Yangon";
$out1 = ob_get_contents();
echo "How do you do?";
echo "where do you live";
$out2 = ob_get_contents();
ob_end_clean();
var_dump($out1);
var_dump($out2);
?>
view raw index.php hosted with ❤ by GitHub

                အပေါ်မှာ ပြထားတဲ့အတိုင်း run ကြည့်မယ်ဆိုရင် output အနေနဲ့ အောက်ပါအတိုင်း ပြပါလိမ့်မယ်။ buffer တွေကို အပိုင်းလိုက် အပိုင်းလိုက် ရိုက်ထုတ်ချင်တဲ့အခါ အများကြီး အသုံးဝင်ပါတယ်။


ob_start with ob_get_clean

                ob_get_clean() ကတော့ buffer ထဲမှာ ရိုက်ထည့်ထားတာအားလုံးကို string value အနေနဲ့ စုပြီး ထုတ်ယူလိုက်တာပါ။ 

<?php
ob_start();
echo "How are you and where do you live? ";
echo "I live in Yangon";
echo "How do you do?";
echo "where do you live";
$out = ob_get_clean();
// echo $out;
?>
view raw index.php hosted with ❤ by GitHub

နိဂုံး

                ဒီလောက်ဆိုရင် Output Control အကြောင်း သဘောပေါက်လောက်ပြီ ထင်ပါတယ်။ တကယ့်လက်တွေ့မှာ အင်မတန်း အသုံးဝင်တဲ့ Feature တစ်ခု ဖြစ်တာနဲ့အညီ လက်တွေ့လုပ်ငန်းခွင်မှာ အသုံးချနိုင်ကြပါစေ။