با استفاده از تابع stream_read، یک اسکریپت PHP بنویسید که یک فایل بزرگ را بلوکبلوک بخواند و با ارسال هدرهای مناسب (مثل Content-Type و Content-Length) آن را به مرورگر استریم کند.
13.0 بازدید آخرین ویرایش در 198 روز قبل ساعت 01:46 0.0
برای حل این مسئله فایل را با fopen در حالت باینری باز کنید، اندازهٔ فایل را با filesize یا fstat بهدست آورید و قبل از هر خروجی هدرهای مناسب (Content-Type و Content-Length) را ارسال کنید. برای خواندن تدریجی از stream_read (یا بهطور متداول fread) با اندازهٔ بلوک مثلاً 8192 بایت استفاده کنید، در حلقهای تا انتهای فایل بخوانید، echo کنید و پس از هر بلوک flush() را فراخوانی کنید تا دادهها به مرورگر برسند؛ همچنین خروجی بافرها را با ob_end_clean() پاک کرده و set_time_limit(0) را برای جلوگیری از خاموش شدن اسکریپت تنظیم کنید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
پیش از خروجیدادن حتما هدرهای Content-Type و Content-Length را ارسال و با ob_end_clean() و set_time_limit(0) بافرها و زمان اجرا را مدیریت کنید تا اسکریپت برای فایلهای بزرگ پایدار بماند. برای خواندن بلوکبلوک از fread یا stream_read با اندازهٔ 8KiB یا 16KiB استفاده کنید و بعد از هر بلوک flush() را فراخوانی کنید تا دادهها به مرورگر فوراً برسند و حافظه مصرفی ثابت بماند. اگر میخواهید از ادامهٔ دانلود (resume) یا پلیرهای رسانهای پشتیبانی کنید، پیادهسازی هدرهای Range/206 Partial Content ضروری است. همچنین مسیر فایل را حتماً اعتبارسنجی کنید و در صورت نیاز برای امنیت و کشینگ هدرهای مناسب (Cache-Control, Content-Disposition) را اضافه نمایید.
گزارش