پرش به مطلب اصلی
نسخه: 1.1.0

خطاهای محدودیت منابع سرور (max_post_size, memory_limit)

مشکل

اگر هنگام ارسال یک درخواست (request) با یکی از خطاهای زیر مواجه شدید:

  • PostTooLargeException in ValidatePostSize.php line XX:
  • HTTP 500 Payload Too Large
  • عدم امکان رمزگشایی ورودی (Unable to decode input) (مثلاً هنگام آپلود تصویر)
  • یا هر خطای دیگری مربوط به محدودیت اندازه، زمان یا حافظه

باید پارامترهای زیر را در فایل php.ini خود بررسی کنید:

  • max_file_size
  • upload_max_filesize
  • post_max_size

شما در موارد متعددی با این مشکل مواجه خواهید شد و معمولاً به این دلیل است که مقدار پیش‌فرض max_file_size از اندازه فایلی که قصد آپلود آن را دارید، کوچکتر است.

راه‌حل

اگر با مشکل ذکر شده در بالا مواجه شدید، باید بدانید که علاوه بر محدودیت اندازه فایل، یک محدودیت حافظه (memory limit) نیز وجود دارد که باید به آن توجه کنید. چندین متغیر (از فایل php.ini شما) در این زمینه نیاز به بررسی دارند...

post_max_size
upload_max_filesize
max_execution_time
max_input_time
memory_limit

مثال:

این پیکربندی به شما امکان آپلود یک فایل ۱۷ مگابایتی را می‌دهد.

post_max_size = 128M
upload_max_filesize = 64M
max_execution_time = 120
max_input_time = 240
memory_limit = 512M

انجام شد.


راه‌حل‌های پیشرفته (که به ندرت استفاده می‌شوند):

اگر راه‌حل بالا مشکل را حل نکرد (که بسیار نادر است)، باید تنظیمات زیر را در نظر بگیرید:

تنظیمات Nginx

حتی اگر ندانید چگونه آن را پیکربندی کنید، باید به یک تنظیم در فایل nginx.conf توجه کنید: client_max_body_size. مستندات رسمی آن در اینجا موجود است.

همانطور که می‌توانید بخوانید، مقدار پیش‌فرض آن فقط 1m (یک مگابایت) است، به این معنی که کل درخواست POST شما حداکثر می‌تواند ۱ مگابایت باشد. بنابراین، شما باید این تنظیم را به 20m یا بالاتر تغییر دهید.

تنظیمات Apache

اگر از وب‌سرور آپاچی (Apache) استفاده می‌کنید، یک تنظیم نیز برای این منظور به نام LimitRequestBody وجود دارد. مستندات رسمی آن در اینجا موجود است.

تفاوت در اینجا این است که آپاچی به طور پیش‌فرض هیچ محدودیتی اعمال نمی‌کند. بنابراین، این احتمال وجود دارد که هرگز نیازی به ویرایش این مقدار نداشته باشید، اما جهت اطلاع، خوب است که از وجود آن آگاه باشید.