PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : سوال در مورد ob_start



naghmesra
July 7th, 2017, 01:10
سلام و درود

این ob_start(); که ابتدای بعضی از فایل های php میذارن کارش چیه؟

در ابتدای فایل ربات تلگرام استفاده بشه تاثیری داره؟

تشکر

M.Abooali
July 7th, 2017, 17:11
وقتی نیاز به چیزی پیدا کردید باید برید دنبالش نه این که بگردین ببینی چی هست و حالا بزاریم رو کد یا نزاریم !

ob_Strart بخشی از ترکیب توابع مرتبط جهت اجرا شدن کدها در سمت سررو پیش از تولید خروجی هست. میتوان جهت منظورهای مختلف مثل ایجاد نسخه کش، تولید خروجی و پیاده سازی *****ها روش یا ایجاد them engin ازش استفاده کرد.

AtrafNet
July 7th, 2017, 20:15
سلام

تابع 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 رو می رسونه اما در بعضی موارد خاص ممکنه برنامه نویس حرفه ای هم نتونه زمان بندی مشخص رو به دلایلی پیش بینی کنه و مجبور میشه از این توابع که استثنایی رو براش ایجاد میکنن استفاده کنه.

naghmesra
July 7th, 2017, 20:29
درود مجدد


سلام

تابع 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 رو می رسونه اما در بعضی موارد خاص ممکنه برنامه نویس حرفه ای هم نتونه زمان بندی مشخص رو به دلایلی پیش بینی کنه و مجبور میشه از این توابع که استثنایی رو براش ایجاد میکنن استفاده کنه.

ممنون از پاسخ کاملتون.

یعنی با این حساب فایل php ای که توش هیچ echo یا print یا HTML یا حتی Header ای نیست اصلا احتیاجی به Output Buffering نداره؟

تشکر

AtrafNet
July 7th, 2017, 21:06
درود مجدد



ممنون از پاسخ کاملتون.

یعنی با این حساب فایل php ای که توش هیچ echo یا print یا HTML یا حتی Header ای نیست اصلا احتیاجی به Output Buffering نداره؟

تشکر

اصولاً نه چون همونطور که گفتم ویژگی Output Buffering همونطور که از اسمش معلومه (که یعنی خروجی که Output بشه رو به صورت موقت Buffer میکنه) فقط برای مواقعیه که خروجی وجود داره اما به دلایلی نمی خواین در اون زمان ارسال و چاپ بشه.

وگرنه اگر پروژه معمولی دارید که همه چیز روی حساب کتابه و مشخصه که چه وقتی خروجی ها ارسال میشه مسلماً نیازی به بافر کردن موقت خروجی ها و آخر سر رها کردن این بافر نیست و تازه اگر نیاز نباشه ولی این کار رو انجام بدید فقط سربار اضافی هم به PHP و هم به حافظه RAM سرور اضافه کردید.

M.Abooali
July 8th, 2017, 20:39
استفاده بی دلیل از این توابع فقط تنبلی برنامه نویس در خطایابی ها و موقعیت سنجی های مناسب برای ابتدا ارسال HTTP Header ها و سپس ارسال خروجی HTML رو می رسونه اما در بعضی موارد خاص ممکنه برنامه نویس حرفه ای هم نتونه زمان بندی مشخص رو به دلایلی پیش بینی کنه و مجبور میشه از این توابع که استثنایی رو براش ایجاد میکنن استفاده کنه.


تنبلی؟ زمان بندی؟ توضیحات شما خوب بود اما این نظرات شخصی که آخرش دادین کلا پست مفید شما رو زیر سوال برد!

ممکن شما بگید مثلا برای کش صفحات وب از چه راهکاری غیر از بافرینگ استفاده میکنید یا برای ساخت یک Them Engin یا مثلا برای ساخت یک فیلتـــر در قالب پلاگین؟

AtrafNet
July 9th, 2017, 09:09
تنبلی؟ زمان بندی؟ توضیحات شما خوب بود اما این نظرات شخصی که آخرش دادین کلا پست مفید شما رو زیر سوال برد!

ممکن شما بگید مثلا برای کش صفحات وب از چه راهکاری غیر از بافرینگ استفاده میکنید یا برای ساخت یک Them Engin یا مثلا برای ساخت یک فیلتـــر در قالب پلاگین؟


بله درسته می تونه کارکرد سیستم Caching هم داشته باشه مثلاً اینطوری که موقع نمایش خروجی بافر شده به کاربر اونا رو تو یه فایل در سرور هم ذخیره میکنیم تا دفعه بعد اگر فایل وجود داشت دوباره مراحل تولید بافر رو انجام ندیم.
اون زمان بندی ارسال اول هدر ها و سپس خروجی HTML هم برای عموم پروژه ها منظورم بود که اغلب تا وقتی بشه منطقی کارکرد خروجی ها رو برنامه ریزی کرد نیازی به این توابع ob نیست چون بار ها به وضوح دیدم کسانی رو که از توابع ob صرفاً معادل چیزی مثل On Error Resume Next در ویژوال بیسیک استفاده میکنن تا بتونن از مشکلی که کدشون در ارسال اول هدر ها و سپس خروجی HTML داره رو بی زحمت برطرف کنن اما مسلماً اگه یکم بشینن به فایل هاشون نگاه بندازن می تونن بفهمن مشکل خطای Headers already sent از کجاست و رفعش کنن که نیاز به استفاده بی مورد از توابع ob هم نباشه.

وگرنه روی حرف من با دوستان حرفه ای مثل شما نبود که استفاده های خاص خودتون رو از این توابع دارید :)