পিএইচপি-তে ob_start () এর ব্যবহার কী?


298

হয় ob_start()জন্য ব্যবহৃত output bufferingযাতে হেডার বাফার করা হয় এবং ব্রাউজারে পাঠানো? আমি কি এখানে বোঝাচ্ছি? যদি না হয় তবে কেন আমাদের ব্যবহার করা উচিত ob_start()?

উত্তর:


481

চিন্তা করুন 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()যা যা সংরক্ষণ করা বন্ধ করে দেয় এবং যা সংরক্ষণ করা বন্ধ করে দেয় বা সংরক্ষণ বন্ধ করে দেয় এবং যথাক্রমে একবারে এটি আউটপুট করে।


55
দুর্দান্ত ব্যাখ্যা। আমি আরও এক ধাপ যান এবং প্রতিস্থাপন করবে 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)
কন আন্তোনাকোস

আমি ধরে নিয়েছি আউটপুট বাফারিংকে কল করার জন্য .ini ফাইল ক্রমে সক্ষম করতে হবে এটি ob_start();কি সঠিক? এটি সক্ষম না হলে কী হবে?
কেভিন হুইলার

5
@ রিলে ডটন আপনি বলছেন না যে কেন ob_start () ব্যবহার করা হয়
বিষ্ণু আর নায়ার

একই সমস্যাটি ছিল, ob_end_cleanএটির সাথে আমার কোডটি ফিক্স করার পরে মোহন মতো কাজ করে! ধন্যবাদ @ রিলে ডটন
মার্টিনস

160

আমি এটি ব্যবহার করি যাতে অনেকগুলি এইচটিএমএল দিয়ে পিএইচপি ছাড়তে পারি তবে এটি রেন্ডার করতে পারি না। এটি আমাকে স্ট্রিং হিসাবে সংরক্ষণ করতে বাঁচায় যা 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>';
?>

1
এটি কি কোনও এক পিএইচপি-র মধ্যে একাধিক এইচটিএমএল পৃষ্ঠাগুলি রাখার উপায় হিসাবে এবং সেগুলি জিইটি এর মাধ্যমে কল করতে পারে?
joshkrz

1
আমি মনে করি তবে এটি একটি ভাল ধারণা বলে মনে হয় না। এগুলি পৃথক টেম্পলেটগুলি থেকে লোড করা ভাল।
জেডি আইজ্যাকস

1
নোট করুন যে এই কৌশলটি ব্যবহার করে ob_get_clean(), না ob_end_clean()
ব্লেজমোনজার

11
এটি কখনও ভাবেন নি, এটি বিকাশের জন্য অবিশ্বাস্যভাবে আইডিই-বান্ধব উপায়! এছাড়াও, এটি আমার পিএইচপি-তে স্ট্রিং হিসাবে জাভাস্ক্রিপ্ট বা এইচটিএমএল থাকা আমার প্রয়োজনকে সরিয়ে দেয়, ক্রমাগত বিরক্তিকর etc "ইত্যাদি থেকে পালিয়ে যায়
জে-ডিজল

1
আপনার ভিজ্যুয়াল ob_start ব্যবহারের সুবিধাগুলি সম্পর্কে একটি পরিষ্কার চিত্র দেয়।
ক্লিভিস

86

এখানে গৃহীত উত্তরটি কী ob_start()করে তা বর্ণনা করে - কেন এটি ব্যবহৃত হয় না (যা প্রশ্নটি জিজ্ঞাসা করা হয়েছিল)।

অন্যত্র যেমন বলা হয়েছে ob_start()একটি বাফার তৈরি করে যা আউটপুটকে লেখা হয়।

তবে কেউই উল্লেখ করেন নি যে পিএইচপি-র মধ্যে একাধিক বাফার স্ট্যাক করা সম্ভব। দেখুন ob_get_level ()।

কেন ...

  1. বৃহত্তর অংশগুলিতে ব্রাউজারে এইচটিএমএল পাঠানো হ্রাস করা নেটওয়ার্ক ওভারহেড থেকে একটি পারফরম্যান্স সুবিধা দেয়।

  2. বৃহত্তর অংশগুলিতে পিএইচপি এর বাইরে ডেটা প্রেরণ করা প্রসঙ্গে প্রয়োজনীয় সুইচগুলির সংখ্যা হ্রাস করে একটি কর্মক্ষমতা এবং ক্ষমতা বেনিফিট দেয়

  3. Mod_gzip / mod_deflate এ বৃহত্তর তথ্য উপাত্ত পাস করা একটি সংক্ষিপ্ততর সুবিধা দেয় যাতে সংকোচন আরও কার্যকর হতে পারে।

  4. আউটপুট বাফারিং এর অর্থ আপনি কোডের পরেও এইচটিটিপি শিরোনামগুলি চালিত করতে পারেন

  5. [হেড] .... আউটপুট করার পরে স্পষ্টভাবে বাফারটি ফ্লাশ করছে .... [/ হেড] এইচটিএমএল স্ট্রিমটি সম্পূর্ণ হওয়ার আগে ব্রাউজারটিকে পৃষ্ঠার জন্য অন্যান্য সংস্থানগুলি মার্শালিং শুরু করতে দেয়।

  6. বাফারে আউটপুট ক্যাপচার করার অর্থ হ'ল এটি ইমেলের মতো অন্যান্য ফাংশনে পুনঃনির্দেশ করতে পারে বা কোনও ফাইলে কন্টেন্টের ক্যাশেড উপস্থাপনা হিসাবে অনুলিপি করতে পারে


29

আপনি এটি পিছনের দিকে আছে। ob_start শিরোনাম বাফার করে না, এটি সামগ্রীকে বাফার করে। ব্যবহারের ob_startসাহায্যে আপনি সামগ্রীটি প্রদর্শন করতে প্রস্তুত না হওয়া পর্যন্ত সার্ভার-সাইড বাফারে রাখতে পারবেন।

এটি সাধারণত ব্যবহার করা হয় যাতে পৃষ্ঠাগুলি ইতিমধ্যে কিছু সামগ্রী 'তারা' প্রেরণ 'করার পরে' শিরোনাম প্রেরণ করতে পারে (অর্থাত্ কোনও পৃষ্ঠাটি রেন্ডারিংয়ের মাধ্যমে অর্ধপথে পুনর্নির্দেশের সিদ্ধান্ত নেওয়া)।


3
+1 আমিও ফাংশনের আসল ব্যবহার সম্পর্কে বিভ্রান্ত হয়ে পড়েছিলাম। "পুনর্নির্দেশ" চলাকালীন এর ব্যবহার সম্পর্কিত আপনার উত্তর আমাকে "শিরোনাম ইতিমধ্যে প্রেরণ করেছে" ত্রুটিযুক্ত হওয়ার সমস্ত সময় মনে করিয়ে দেয়। ধন্যবাদ
প্যাট

13

আমি পছন্দ করি:

ob_start();
echo("Hello there!");
$output = ob_get_clean(); //Get current buffer contents and delete current output buffer

8

এটি জেডি ইসহাক্স উত্তরটি আরও স্পষ্ট করতে ...

আপনি যে সমস্যাটি প্রায়শই চালান তা হ'ল আপনি পিএইচপি থেকে বিভিন্ন পিএইচপি উত্স থেকে এইচটিএমএল আউটপুট ব্যবহার করছেন এবং এই উত্সগুলি প্রায়শই, যে কোনও কারণেই হোক না কেন, বিভিন্ন উপায়ে আউটপুট আউট করা হয়।

কখনও কখনও আপনার কাছে আক্ষরিক এইচটিএমএল সামগ্রী রয়েছে যা আপনি সরাসরি ব্রাউজারে আউটপুট করতে চান; অন্য সময় আউটপুটটি গতিশীলভাবে তৈরি হচ্ছে (সার্ভার-সাইড)।

গতিশীল বিষয়বস্তু সর্বদা (?) স্ট্রিং হতে চলেছে। এখন আপনাকে এই স্ট্রিংফাইড ডায়নামিক এইচটিএমএলকে যে কোনও আক্ষরিক, ডাইরেক্ট-টু-ডিসপ্লে এইচটিএমএলকে এক অর্থপূর্ণ এইচটিএমএল নোড কাঠামোর সাথে একত্রিত করতে হবে।

এটি সাধারণত বিকাশকারীকে ডাইরেক্ট-টু-ডিসপ্লে সামগ্রীটি স্ট্রিংয়ের মধ্যে আবদ্ধ করতে বাধ্য করে (যেমনটি জেডি আইজাক আলোচনা করছিলেন) যাতে এটি ডায়নামিক এইচটিএমএলের সাথে একত্রে সঠিকভাবে ডেলিভারি / সন্নিবেশ করা যায় ... যদিও আপনি সত্যই না এটি আবৃত করতে চান

তবে ওব _ ## পদ্ধতি ব্যবহার করে আপনি সেই স্ট্রিং-মোড়কির ঝামেলা এড়াতে পারবেন। আক্ষরিক বিষয়বস্তু, পরিবর্তে, বাফারে আউটপুট। তারপরে একটি সহজ পদক্ষেপে বাফারের পুরো বিষয়বস্তু (আপনার সমস্ত আক্ষরিক এইচটিএমএল), আপনার গতিশীল-এইচটিএমএল স্ট্রিংয়ের সাথে সংযুক্ত করা হয়।

(আমার উদাহরণটি আক্ষরিক এইচটিএমএলকে বাফারে আউটপুট হিসাবে দেখায় যা এরপরে এইচটিএমএল-স্ট্রিংয়ের সাথে যুক্ত হয় ... স্ট্রিং-মোড়ক-এইচটিএমএল দেখতে জেডি আইজাক্স উদাহরণটিও দেখুন)।

<?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>

4

এই ফাংশনটি কেবল শিরোনামের জন্য নয়। আপনি এটি দিয়ে অনেক আকর্ষণীয় স্টাফ করতে পারেন। উদাহরণ: আপনি নিজের পৃষ্ঠাটি বিভাগগুলিতে বিভক্ত করতে এবং এটি ব্যবহার করতে পারেন:

$someTemplate->selectSection('header');
echo 'This is the header.';

$someTemplate->selectSection('content');
echo 'This is some content.';

আপনি এখানে উত্পন্ন আউটপুট ক্যাপচার করতে পারেন এবং এটি আপনার বিন্যাসে সম্পূর্ণ দুটি পৃথক স্থানে যুক্ত করতে পারেন।


এই ধরণের চেহারাটি আমি যা খুজছি। আমাকে 'বিভাগগুলি' (জেএস এবং সিএসএস ফাইলগুলির কথা ভাবা) তে স্ট্যান্ডার্ড রেন্ডার করতে হবে, তবে আমি সেগুলি টেমপ্লেটের মধ্যে কল করতে সক্ষম হব (যা শিরোনামের চেয়ে পরে লোড হয়ে যায়) ... তাই যদি আমি "$ এটি- কল করি > addcss ( 'specificCSStoThisView'); " আমি এটি <হেড> ট্যাগগুলির মধ্যে রেন্ডার করতে চাই। তবে আমি এটি গুগল করতে পারি না। আপনি কি আমাকে সঠিক দিকে নির্দেশ করতে পারেন? ধন্যবাদ!
NoobishPro

2

বিদ্যমান উত্তরগুলিতে নিম্নলিখিত বিষয়গুলি উল্লেখ করা হয়নি: বাফার আকারের কনফিগারেশন 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


0

না, আপনি ভুল, কিন্তু দিকটি ফিট করে;)

আউটপুট-বাফারিং কোনও স্ক্রিপ্টের আউটপুট বাফার করে। Thats (সংক্ষেপে) কখনও echoবা পরে print। শিরোনামগুলির সাথে জিনিসটি হ'ল, যদি তারা ইতিমধ্যে প্রেরণ না করা হয় তবে কেবল তারা প্রেরণ করতে পারে। তবে এইচটিটিপি বলছে, শিরোনাম হ'ল সংক্রমণের প্রথম স্থান। সুতরাং আপনি যদি প্রথমবারের জন্য কিছু আউটপুট করেন (অনুরোধে) শিরোনামগুলি প্রেরণ করা হয় এবং আপনি অন্য কোনও শিরোনাম সেট করতে পারেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.