হয় ob_start()
জন্য ব্যবহৃত output buffering
যাতে হেডার বাফার করা হয় এবং ব্রাউজারে পাঠানো? আমি কি এখানে বোঝাচ্ছি? যদি না হয় তবে কেন আমাদের ব্যবহার করা উচিত ob_start()
?
হয় ob_start()
জন্য ব্যবহৃত output buffering
যাতে হেডার বাফার করা হয় এবং ব্রাউজারে পাঠানো? আমি কি এখানে বোঝাচ্ছি? যদি না হয় তবে কেন আমাদের ব্যবহার করা উচিত ob_start()
?
উত্তর:
চিন্তা করুন ob_start()
বলেছেন বলে "শুরু সবকিছু যে স্বাভাবিকভাবে outputted করা হবে, কিন্তু বেশ এখনো এটা দিয়ে কিছু করবেন না স্মরণ।"
উদাহরণ স্বরূপ:
ob_start();
echo("Hello there!"); //would normally get printed to the screen/output to browser
$output = ob_get_contents();
ob_end_clean();
আপনি সাধারণত এটির সাথে যুক্ত হন আরও দুটি ফাংশন: ob_get_contents()
যা বাফারটি চালু হওয়ার পরে মূলত আপনাকে যা কিছু "সংরক্ষণ" করা হয়েছে তা দেয় ob_start()
এবং তারপরে ob_end_clean()
বা ob_flush()
যা যা সংরক্ষণ করা বন্ধ করে দেয় এবং যা সংরক্ষণ করা বন্ধ করে দেয় বা সংরক্ষণ বন্ধ করে দেয় এবং যথাক্রমে একবারে এটি আউটপুট করে।
ob_start();
কি সঠিক? এটি সক্ষম না হলে কী হবে?
ob_end_clean
এটির সাথে আমার কোডটি ফিক্স করার পরে মোহন মতো কাজ করে! ধন্যবাদ @ রিলে ডটন
আমি এটি ব্যবহার করি যাতে অনেকগুলি এইচটিএমএল দিয়ে পিএইচপি ছাড়তে পারি তবে এটি রেন্ডার করতে পারি না। এটি আমাকে স্ট্রিং হিসাবে সংরক্ষণ করতে বাঁচায় যা IDE রঙ-কোডিং অক্ষম করে।
<?php
ob_start();
?>
<div>
<span>text</span>
<a href="#">link</a>
</div>
<?php
$content = ob_get_clean();
?>
পরিবর্তে:
<?php
$content = '<div>
<span>text</span>
<a href="#">link</a>
</div>';
?>
ob_get_clean()
, না ob_end_clean()
এখানে গৃহীত উত্তরটি কী ob_start()
করে তা বর্ণনা করে - কেন এটি ব্যবহৃত হয় না (যা প্রশ্নটি জিজ্ঞাসা করা হয়েছিল)।
অন্যত্র যেমন বলা হয়েছে ob_start()
একটি বাফার তৈরি করে যা আউটপুটকে লেখা হয়।
তবে কেউই উল্লেখ করেন নি যে পিএইচপি-র মধ্যে একাধিক বাফার স্ট্যাক করা সম্ভব। দেখুন ob_get_level ()।
কেন ...
বৃহত্তর অংশগুলিতে ব্রাউজারে এইচটিএমএল পাঠানো হ্রাস করা নেটওয়ার্ক ওভারহেড থেকে একটি পারফরম্যান্স সুবিধা দেয়।
বৃহত্তর অংশগুলিতে পিএইচপি এর বাইরে ডেটা প্রেরণ করা প্রসঙ্গে প্রয়োজনীয় সুইচগুলির সংখ্যা হ্রাস করে একটি কর্মক্ষমতা এবং ক্ষমতা বেনিফিট দেয়
Mod_gzip / mod_deflate এ বৃহত্তর তথ্য উপাত্ত পাস করা একটি সংক্ষিপ্ততর সুবিধা দেয় যাতে সংকোচন আরও কার্যকর হতে পারে।
আউটপুট বাফারিং এর অর্থ আপনি কোডের পরেও এইচটিটিপি শিরোনামগুলি চালিত করতে পারেন
[হেড] .... আউটপুট করার পরে স্পষ্টভাবে বাফারটি ফ্লাশ করছে .... [/ হেড] এইচটিএমএল স্ট্রিমটি সম্পূর্ণ হওয়ার আগে ব্রাউজারটিকে পৃষ্ঠার জন্য অন্যান্য সংস্থানগুলি মার্শালিং শুরু করতে দেয়।
বাফারে আউটপুট ক্যাপচার করার অর্থ হ'ল এটি ইমেলের মতো অন্যান্য ফাংশনে পুনঃনির্দেশ করতে পারে বা কোনও ফাইলে কন্টেন্টের ক্যাশেড উপস্থাপনা হিসাবে অনুলিপি করতে পারে
আপনি এটি পিছনের দিকে আছে। ob_start শিরোনাম বাফার করে না, এটি সামগ্রীকে বাফার করে। ব্যবহারের ob_start
সাহায্যে আপনি সামগ্রীটি প্রদর্শন করতে প্রস্তুত না হওয়া পর্যন্ত সার্ভার-সাইড বাফারে রাখতে পারবেন।
এটি সাধারণত ব্যবহার করা হয় যাতে পৃষ্ঠাগুলি ইতিমধ্যে কিছু সামগ্রী 'তারা' প্রেরণ 'করার পরে' শিরোনাম প্রেরণ করতে পারে (অর্থাত্ কোনও পৃষ্ঠাটি রেন্ডারিংয়ের মাধ্যমে অর্ধপথে পুনর্নির্দেশের সিদ্ধান্ত নেওয়া)।
এটি জেডি ইসহাক্স উত্তরটি আরও স্পষ্ট করতে ...
আপনি যে সমস্যাটি প্রায়শই চালান তা হ'ল আপনি পিএইচপি থেকে বিভিন্ন পিএইচপি উত্স থেকে এইচটিএমএল আউটপুট ব্যবহার করছেন এবং এই উত্সগুলি প্রায়শই, যে কোনও কারণেই হোক না কেন, বিভিন্ন উপায়ে আউটপুট আউট করা হয়।
কখনও কখনও আপনার কাছে আক্ষরিক এইচটিএমএল সামগ্রী রয়েছে যা আপনি সরাসরি ব্রাউজারে আউটপুট করতে চান; অন্য সময় আউটপুটটি গতিশীলভাবে তৈরি হচ্ছে (সার্ভার-সাইড)।
গতিশীল বিষয়বস্তু সর্বদা (?) স্ট্রিং হতে চলেছে। এখন আপনাকে এই স্ট্রিংফাইড ডায়নামিক এইচটিএমএলকে যে কোনও আক্ষরিক, ডাইরেক্ট-টু-ডিসপ্লে এইচটিএমএলকে এক অর্থপূর্ণ এইচটিএমএল নোড কাঠামোর সাথে একত্রিত করতে হবে।
এটি সাধারণত বিকাশকারীকে ডাইরেক্ট-টু-ডিসপ্লে সামগ্রীটি স্ট্রিংয়ের মধ্যে আবদ্ধ করতে বাধ্য করে (যেমনটি জেডি আইজাক আলোচনা করছিলেন) যাতে এটি ডায়নামিক এইচটিএমএলের সাথে একত্রে সঠিকভাবে ডেলিভারি / সন্নিবেশ করা যায় ... যদিও আপনি সত্যই না এটি আবৃত করতে চান
তবে ওব _ ## পদ্ধতি ব্যবহার করে আপনি সেই স্ট্রিং-মোড়কির ঝামেলা এড়াতে পারবেন। আক্ষরিক বিষয়বস্তু, পরিবর্তে, বাফারে আউটপুট। তারপরে একটি সহজ পদক্ষেপে বাফারের পুরো বিষয়বস্তু (আপনার সমস্ত আক্ষরিক এইচটিএমএল), আপনার গতিশীল-এইচটিএমএল স্ট্রিংয়ের সাথে সংযুক্ত করা হয়।
(আমার উদাহরণটি আক্ষরিক এইচটিএমএলকে বাফারে আউটপুট হিসাবে দেখায় যা এরপরে এইচটিএমএল-স্ট্রিংয়ের সাথে যুক্ত হয় ... স্ট্রিং-মোড়ক-এইচটিএমএল দেখতে জেডি আইজাক্স উদাহরণটিও দেখুন)।
<?php // parent.php
//---------------------------------
$lvs_html = "" ;
$lvs_html .= "<div>html</div>" ;
$lvs_html .= gf_component_assembler__without_ob( ) ;
$lvs_html .= "<div>more html</div>" ;
$lvs_html .= "----<br/>" ;
$lvs_html .= "<div>html</div>" ;
$lvs_html .= gf_component_assembler__with_ob( ) ;
$lvs_html .= "<div>more html</div>" ;
echo $lvs_html ;
// 02 - component contents
// html
// 01 - component header
// 03 - component footer
// more html
// ----
// html
// 01 - component header
// 02 - component contents
// 03 - component footer
// more html
//---------------------------------
function gf_component_assembler__without_ob( )
{
$lvs_html = "<div>01 - component header</div>" ; // <table ><tr>" ;
include( "component_contents.php" ) ;
$lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ;
return $lvs_html ;
} ;
//---------------------------------
function gf_component_assembler__with_ob( )
{
$lvs_html = "<div>01 - component header</div>" ; // <table ><tr>" ;
ob_start();
include( "component_contents.php" ) ;
$lvs_html .= ob_get_clean();
$lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ;
return $lvs_html ;
} ;
//---------------------------------
?>
<!-- component_contents.php -->
<div>
02 - component contents
</div>
এই ফাংশনটি কেবল শিরোনামের জন্য নয়। আপনি এটি দিয়ে অনেক আকর্ষণীয় স্টাফ করতে পারেন। উদাহরণ: আপনি নিজের পৃষ্ঠাটি বিভাগগুলিতে বিভক্ত করতে এবং এটি ব্যবহার করতে পারেন:
$someTemplate->selectSection('header');
echo 'This is the header.';
$someTemplate->selectSection('content');
echo 'This is some content.';
আপনি এখানে উত্পন্ন আউটপুট ক্যাপচার করতে পারেন এবং এটি আপনার বিন্যাসে সম্পূর্ণ দুটি পৃথক স্থানে যুক্ত করতে পারেন।
বিদ্যমান উত্তরগুলিতে নিম্নলিখিত বিষয়গুলি উল্লেখ করা হয়নি: বাফার আকারের কনফিগারেশন HTTP শিরোনাম এবং নেস্টিং।
Ob_start এর জন্য বাফার আকারের কনফিগারেশন:
ob_start(null, 4096); // Once the buffer size exceeds 4096 bytes, PHP automatically executes flush, ie. the buffer is emptied and sent out.
উপরের কোডটি সার্ভারের কার্যকারিতা উন্নত করে যেমন পিএইচপি বড় আকারের ডেটা প্রেরণ করবে, উদাহরণস্বরূপ, 4KB (ওব_স্টার্ট কল, পিএইচপি ব্রাউজারে প্রতিটি প্রতিধ্বনি প্রেরণ করবে)।
যদি আপনি খণ্ড আকার ছাড়াই বাফারিং শুরু করেন (অর্থাত্ একটি সাধারণ ob_start ()), তবে স্ক্রিপ্টের শেষে পৃষ্ঠাটি একবার প্রেরণ করা হবে।
আউটপুট বাফারিং HTTP শিরোনামকে প্রভাবিত করে না, এগুলি বিভিন্ন উপায়ে প্রক্রিয়া করা হয়। তবে, বাফারিংয়ের কারণে আপনি আউটপুট প্রেরণের পরেও শিরোনাম পাঠাতে পারেন, কারণ এটি এখনও বাফারে রয়েছে।
ob_start(); // turns on output buffering
$foo->bar(); // all output goes only to buffer
ob_clean(); // delete the contents of the buffer, but remains buffering active
$foo->render(); // output goes to buffer
ob_flush(); // send buffer output
$none = ob_get_contents(); // buffer content is now an empty string
ob_end_clean(); // turn off output buffering
এখানে সুন্দরভাবে ব্যাখ্যা করা হয়েছে: https://phpfashion.com/everything-about-output-buffering-in-php
না, আপনি ভুল, কিন্তু দিকটি ফিট করে;)
আউটপুট-বাফারিং কোনও স্ক্রিপ্টের আউটপুট বাফার করে। Thats (সংক্ষেপে) কখনও echo
বা পরে print
। শিরোনামগুলির সাথে জিনিসটি হ'ল, যদি তারা ইতিমধ্যে প্রেরণ না করা হয় তবে কেবল তারা প্রেরণ করতে পারে। তবে এইচটিটিপি বলছে, শিরোনাম হ'ল সংক্রমণের প্রথম স্থান। সুতরাং আপনি যদি প্রথমবারের জন্য কিছু আউটপুট করেন (অনুরোধে) শিরোনামগুলি প্রেরণ করা হয় এবং আপনি অন্য কোনও শিরোনাম সেট করতে পারেন না।
ob_get_contents()
সঙ্গেob_get_clean()
এবং অপসারণob_end_clean()
যেহেতুob_get_clean()
মূলত উভয় কর্ম সম্পাদন করে। তথ্যসূত্র: php.net/manual/en/function.ob-get-clean.php (পিএইচপি 4> = 4.3.0, পিএইচপি 5)