Output Buffering در PHP

اردیبهشت ۲۱, ۱۳۹۱ توسط : سعید

یکی از امکانات بسیار مفید PHP برای کنترل خروجی Output buffering میباشد.با استفاده از این امکان میتونیم تصمیم بگیریم که چه چیزی و در چه زمانی به خروجی ارسال بشه.

در ادامه به معرفی این امکان در PHP میپردازیم.

هنگامی که یک کد PHP اجرا میشه یک صفحه HTML از سمت سرور به مرورگر ارسال میشه.اما برای اینکه پس ساخت یک صفحه HTML نخواسته باشیم به مرورگر ارسال بشه چه کاری باید انجام بدیم؟ در اینجا Output buffering  وارد میشه.

در حالت معمول PHP اینکار رو انجام نمیده اما پس از شروع بافر خروجی (Output Buffering) تمام محتویات در بافر داخلی نگهداری میشن سپس به مرورگر ارسال میشن.

چگونه بافر خروجی رو فعال کنیم؟

برای شروع Output Buffering فقط کافیه تابع ob_start رو فراخوانی کنیم :

ob_start()

چگونه محتویات بافر را به مرورگر ارسال کنیم ؟

هنگامی که Output Buffering رو استارت میکنیم تا زمانی که کد ما به انتها نرسیده محتویات به مرورگر ارسال نمیشه.برای ارسال محتویات بافر به خروجی باید از کد زیر استفاده کنیم :

  ob_flush();
اما پس از فراخوانی تابع بالا PHP به ذخیره محتویات در بافر ادامه میده.برای اینکه پس از ارسال محتویات بافر به خروجی و توقف ذخیره محتویات در بافر باید از تابع زیر استفاده کنیم :
ob_end_flush()

حذف محتویات بافر

برای حذف محتویات بافر از دستور زیر استفاده میکنیم :
ob_clean()
اما مثل ob_flush بعد از اجرای این دستور باز هم PHP به بافر کردن کردن محتویات ادامه میده. پس برای اینکه به PHP بگیم پس از خالی کردن بافر دیگه به بافر کردن ادامه نده باید از دستور زیر استفاده کنیم :
ob_end_clean();
دریافت محتویات بافر
برای چک کردن محتویاتی که داخل بافر ذخیره شده از تابع زیر استفاده میکنیم :
ob_get_content();

مزایای استفاده از Output Buffering

در هنگام اجرای کدهای PHP بدون استفاده از بافر خروجی HTML به صورت تکه تکه به مرورگر ارسال میشه.اما با استفاده از بافر خروچی HTML داخل یک متغیر ذخیره میشه سپس یکجا به مرورگر ارسال میشه.

Output Buffering مزیتهایی رو در بر داره که در زیر به تعدادی از اونها اشاده میکنیم :

فشرده کردن محتویات بافرخروجی

برای فشرده کردن محتویات بافر که قراره به خروجی ارسال بشه میتونیم از کد زیر استفاده کنیم :

// start output buffering at the top of our script with this simple command
ob_start('ob_gzhandler'); // "ob_gzhandler" as a parameter of ob_start
?>
Hello world!
<?php
// end output buffering and send our HTML to the browser as a whole
ob_end_flush();
?>
تنها تغیری که کد بالا داشته مربوط به تابع ob_start که مقدار ob_gzhandler رو برای فشرده کردن محتویات بافر بهش ارسال کردیم.
منابع :
http://www.xpertdeveloper.com/2012/05/php-output-buffering/
http://www.exclusivetutorials.com/benefits-of-output-buffering/

بازدید : ۳۷۱۷

اردیبهشت ۲۲, ۱۳۹۱ @ ۹:۰۶ ق.ظ

عالی مثل همیشه. هیچوقت نمیدونستم چرا بافر؟ مرسی ولی یه سوال دارم. محتویات HTML که قبل از اجرای PHP به مرورگر داده میشه رو خودمون ساختیم یا خودش ساخته میشه؟ اگه من قبل <?php از کد HTML استفاده کنم این نیاز به بافر داره؟ (سروری ندارم امتحان کنم. رو لوکال بدون خطا باز میشه ولی رو سرور مثل همیشه دردسر ساز میشه)

پاسخ دادن
سعید
اردیبهشت ۲۲, ۱۳۹۱ @ ۱۱:۴۴ ق.ظ

ممنون علیرضا جان
ببین دستوراتی مثل header باید قبل از هر چیزی به مرور گر ارسال شه.حالا شما اگر توی صفحه ای از دستور header میخوای استفاده کنی نباید قبل از این دستور هیچ محتویاتی به مرورگر ارسال شه.اگر این کارو انجام بدی با پیغام خطای (Warning: Cannot modify header information – headers already sent by (output برخورد میکنی. که برای رفع این مشکل باید از بافر استفاده کنی.

موفق باشی

پاسخ دادن
علیرضا
خرداد ۱۲, ۱۳۹۱ @ ۴:۳۵ ب.ظ

بافر توی اکثر سرور هایی که من باهاش کار کردم ، جواب نمیده و این پیغام خطای مربوط به تابع هدر داده میشه، مگر این که قبل از آن هیچ محتوایی برای مرور گر ارسال نشده باشه، آیا جایگزین دیگر برای توابع بالا است ، چون توابع بالا روی اکثر هاستها کار نمی کنند.

پاسخ دادن
    سعید
    خرداد ۱۴, ۱۳۹۱ @ ۱۲:۴۴ ق.ظ

    من تا جالا با بافر مشکلی نداشتم و از این توابع هم استفاده میکنم. نمیدونم جایگزینی داره یا نه اما در موردش تحقیق میکنم اگر چیزی پیدا کردم حتما توی سایت قرار میدم

    موفق باشی

    پاسخ دادن
بهمن ۲۸, ۱۳۹۲ @ ۴:۴۸ ب.ظ

سلام دستتون درد نکنه ۱۰۰تا سایت راجع به این بافرینگ خوندم هیچی متوجه نشدم الان توضیح دادین کامل فهمیدم
مرسی

پاسخ دادن
الهه
خرداد ۱۳, ۱۳۹۳ @ ۱۰:۲۳ ب.ظ

سلام
فعال بودن این تابع ربطی به سرعت و پرفورمنس سرور داره ؟
ما یه هاست جدید گرفتیم و چون این تابع رو سرور غیرفعال هست با مشکل مواجه شدیم
به هاستینگ میگم فعالش کنید
میگه نمیشه
واسه سرعت php سرور ، این تابع غیرفعال شده

پاسخ دادن
    سعید مقدم زاده
    خرداد ۱۴, ۱۳۹۳ @ ۱۲:۵۷ ق.ظ

    سلام
    تا جایی که من اطلاع دارم و جستجو کردم هیچ مشکلی توی پرفرومنس ندراه و بیشتر باعث انعطاف برنامه میشه.

    پاسخ دادن
    سعید مقدم زاده
    خرداد ۱۴, ۱۳۹۳ @ ۱:۳۲ ب.ظ

    سلام.
    خیر این تابع و استفاده ازش هیچ تاثیر منفی روی سرعت و پرفرمنس برنامه و سرور نداره.

    پاسخ دادن
وحید
آذر ۹, ۱۳۹۵ @ ۷:۵۴ ب.ظ

بسیار عالی

پاسخ دادن

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


*