close
دانلود فیلم
Buffering یا بافر کردن خروجی در PHP

محصول مرتبط با این پست : پکیچ 110 ساعت آموزش برنامه نویسی و طراحی سایت

فیلم های آموزش PHP به زبان فارسی

مجموعه فیلم های آموزشی طراحی وب سایت های پویا از دانشگاه هاوارد

 

 

 

Buffering یا بافر کردن خروجی، امکان پیشرفته ای است که از نسخه چهار PHP افزوده شده است. با فعالسازی OB، دیگر خروجی حاصل از اجرای اسکریپت شما، مستقیما به سمت کلاینت ارسال نمی شود و در عوض، این خروجی در حافظه موقتی سرویس دهنده که اصطلاحا بافر نامیده می شود، ذخیره می شود.



خوب؛ با قرار گرفتن خروجی در بافر، می توان قبل از ارسال محتویات به مرورگر، یک سری عملیات خاص روی خروجی انجام داد. برای مثال در این مطلب، به کاربرد بسیار سودمند آن یعنی «فشرده سازی محتوا » اشاره کردم. از دیگر عملیاتی که می توان نام برد، تبدیل اسناد XML به HTML (مثلا اطلاعات را از سند XML بخوانیم و بوسیله تگهای HTML نمایش دهیم) یا مثلا به کمک عبارات باقاعده (regex)، تمام لینکها یا اصطلاحا URLهای گنجانده شده در خروجی را تغییر داد. یا هر عملیاتی که برای دستکاری رشته کاراکتر می تونید فکرشو بکنید.
بعد از انجام تغییرات، خروجی پردازش شده را می توان به راحتی به سمت کلاینت ارسال و بافر را خالی کرد.
شاید پیش خودتون فکر کنید، اگه من نخوام عملیاتی روی خروجی اپلیکیشن ام انجام بدم چی؟
حتی اگه شما نخواهید، پردازش خاصی روی خروجی اپلیکیشنتون انجام بدید، بافر کردن خروجی، پرفورمنس و بازدهی سایتهای وب مبتنی بر
PHP را بهبود می بخشد، زیرا تعداد عملیات های ورودی/خروجی(I/O) روی سرویس دهنده را کاهش می دهد. فراخوانی لایه I/O سرویس دهنده وب، معمولا عملیات پرخرجی است. گردآوری خروجی در یک بلاک بزرگ و انجام تنها یک عملیات I/O روی آن به مراتب سریعتر از زمانی است که برای هر تکه خروجی منتشر شده توسط PHP، یک عملیات I/O صورت پذیرد. منظورم زمانی است که دستورات echo و print
را صدا می زنید.
حالا اگر اسکریپتهای
PHP شما، صفحات HTMLای با حجم بیش از ۱۰K را بعنوان خروجی تولید می کنند، تخصیص و آزادسازی بافر، ممکن است زمان بیشتری را در مقایسه با کاهش دفعات عملیات های I/O مصرف کند. بنابراین مطابق سایر مواردی که در علوم کامپیوتر وجود دارد، راه حل، یافتن تعادل مناسبی بین پرهیز از بافرینگ و استفاده تمام و کمال از بافرینگ است. خوشبختانه، بافرکردن خروجی PHP به کاربران امکان رسیدن به این تعادل را می دهد. به جای اینکه تمام خروجی بافر شود، ما می توانیم به PHP بگیم که خروجی را بصورت Chunked(قطعه ای) بافر کند. با بافر کردن خروجی به صورت قطعه ای، ما می توانیم مقدار داده های بافر شده را تا مقدار معینی محدود کنیم و هر موقع که به این مقدار رسیدیم و اصطلاحا بافر پر شد، بافر را خالی کنیم. مقدار متعادلی که برای بافر کردن خروجی قطعه ای پیشنهاد می شود، ۴K است.این مقدار به طرز قابل توجهی، دفعات عملیات I/O را کاهش می دهد، بدون اینکه مقدار زیادی از حافظه اشغال شود یا overhead
تخصیص دهی حافظه قابل ملاحظه ای را تحمیل کند.
برای نمونه، اگر اندازه متوسط یک صفحه
HTML تولید شده توسط PHP برابر با ۵۰K باشد، PHP معمولا بین ۵۰۰ تا ۱۰هزار عملیات I/O انجام میدهد. اما با یک بافر ۴کیلوبایتی، این تعداد به ۱۲ تا ۱۳
عملیات کاهش می یابد که بسیار قابل توجه است.
اگر می خواهید این بافر
۴ کیلوبایتی را برای تمام سایت خود فعال کنید، دستورالعمل output_buffering واقع در فایل پیکربندی php.ini را به مقدار ۴۰۹۶ ست کنید. اگه هم می خواهید برای اسکریپتهای خاصی از OB استفاده کنید، از تابع ob_start استفاده کنید. برای مثال با نوشتن:

 

 <?php
ob_start(null, 4096);
// rest of script
?>

 آماده استفاده از این بافر ۴ کیلوبایتی خواهید بود. Buffer مکانی در حافظه کامپیوتر است که می توان اطلاعاتی را به مدت کوتاهی در آن ذخیره کرد.(حافظه موقتی)OB نبود! برای ضبط خروجی یک اسکریپت، باید اون رو در یک رشته کاراکتر می ریختیم و وقتی کارمون تمام شد، اون رو اکو می کردیم.

*)

توضیح تکمیلی:
برمی گردیم به اون زمانی که

 

  <?php
$output = “<html><body>”;
$output .= “Today is “.strftime(“%A, %B %e %Y”);
$output .= “</body></html>”;

echo $output;
cache($output);

 اگه از اون دسته از برنامه نویسان وبی هستید که این رشته خطیر! رو با اسکریپتهای CGI مبتنی بر Perl یاد گرفتید، اسکریپت بالا یادآور خاطرات دردناکی است که باهاش مواجه هستید. اگه هم تجربه این جور اسکریپتها را ندارید، تنها می تونید دورانی رو تصور کنید که اسکریپتهای وب این شکلی بودند!
با استفاده از
OB، اسکریپت به حال عادی برگشت. تنها کاری که باید انجام بدید، اینه که قبل از تولید خروجی بنویسید:

 

 <?php
ob_start();
 ?>

با این کار، OB رو فعال می کنید و از این به بعد، تمام خروجی ها، در بافر داخلی ذخیره می شود. حالا می تونید کد صفحه را مثل یه اسکریپت معمولی، اضافه کنید.

 

 <html>
<body>
Today is <?= strftime(“%A,  %B %e %Y”) ?>
</body>
</html>


خوب به جایی رسیدیم که محتویات صفحه تولید شده؛ چه می کنیم؟! اول، محتویات بافر رو می گیریم و بعد هم اون رو خالی می کنیم.

 

 <?php
$output = ob_get_contents();
ob_end_flush();
?>


()ob_get_contents، محتویات فعلی بافر را به صورت رشته کاراکتر بر می گردونه که می تونید هر بلایی سرش در بیارید. ()ob_end_flush هم بافرینگ رو متوقف می کنه و محتویات فعلی بافر رو به سمت کلاینت روانه می کنه. اگه بخواهید، محتویات رو در یک متغیر بصورت رشته کاراکتری ذخیره کنید و دیگه اون رو سمت مرورگر نفرستید، می تونید ()ob_end_clean را صدا کنید تا بافرینگ رو متوقف کنه و کل محتویات بافر رو هم منهدم کنه! نکته قابل توجه این هست که هر دوی این توابع، بعد از اتمام کارشون، بافر رو از بین می برند. بنابراین برای گرفتن محتویات بافر، تابع ()ob_get_contents رو باید قبل از خاتمه بافرینگ فراخوانی کنید.

لینک کوتاه پست
مطالب مرتبط با پست جاری
  • نکات مهم
    1- لطفا نظر خود را با زبان فارسی بیان کنید
    2- رایتم نظرات اسپم و تبلیغی شما را تایید نمی کند
    3- لطفا نظرات شما بدون ابهام و واضح باشد
  • نام
    ایمیل (منتشر نمی‌شود) (لازم)
    وبسایت
    :):(;):D;)):X:?:P:*=((:O@};-:B/:):S
    نظر خصوصی
    مشخصات شما ذخیره شود ؟[حذف مشخصات] [شکلک ها]
    کد امنیتی
به کانال تلگرام سایت ما بپیوندید