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

توسط پژوهشگر در 198 روز قبل ساعت 01:46
دسته بندی ها: PHP PHP for beginner
nima در 198 روز قبل ساعت 01:47

پیش از خروجی‌دادن حتما هدرهای 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) را اضافه نمایید.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری