سلام
تابع ob_start حالت Output Buffering رو در PHP فعال میکنه و تا زمانی که این حالت فعال باشه تمامی خروجی های HTML چاپ شده (مثل توابع echo و print یا html معمولی و...) به جز HTTP Header ها نادیده گرفته میشن تا باعث ایجاد تداخل بین زمان ارسال HTTP Header ها و خروجی HTML نشن چون همونطور که شاید بدونید HTTP Header ها حتماً باید قبل از ارسال حتی یه حرف از خروجی HTML به مرورگر ارسال شده باشن و اگر مثلاً خروجی HTML ارسال شده باشه و شما بخواید بعدش با تابع header یک HTTP Header هم ارسال کنید با اخطار Header Already Sent در PHP مواجه میشید.
تابع ob_start نیازمند اتمام با یکی از توابع ob_end_flush یا ob_end_clean هست تا حالت Output Buffering دوباره غیرفعال بشه اما بین این دو تابع که کار اتمام بافر رو انجام میدن تفاوتی که هست اینه که تابع ob_end_flush علاوه بر حذف بافر ذخیره شده از خروجی های که تا الان نادیده گرفته شدن، اون ها رو برای کاربر هم آخر سر ارسال میکنه ولی تابع ob_end_clean فقط بافر رو کاملاً از حافظه حذف میکنه و دیگه هیچی از خروجی هایی که حین فعال بودن حالت Output Buffering نادیده گرفته شدن برای کاربر ارسال نمیشن.
منابع:
http://php.net/manual/en/function.ob-start.php
http://php.net/manual/en/function.ob-end-flush.php
http://php.net/manual/en/function.ob-end-clean.php
استفاده بی دلیل از این توابع فقط تنبلی برنامه نویس در خطایابی ها و موقعیت سنجی های مناسب برای ابتدا ارسال HTTP Header ها و سپس ارسال خروجی HTML رو می رسونه اما در بعضی موارد خاص ممکنه برنامه نویس حرفه ای هم نتونه زمان بندی مشخص رو به دلایلی پیش بینی کنه و مجبور میشه از این توابع که استثنایی رو براش ایجاد میکنن استفاده کنه.