افزایش حداکثر حجم آپلود فایل در وردپرس
سه تنظیم حجم آپلود وردپرس را کنترل میکنند و هر سه باید با هم هماهنگ باشند. حد واقعی، کوچکترین مقدار میان upload_max_filesize، post_max_size و سقف درخواست وبسرور شماست.
منتشرشده
سه تنظیم، حد آپلود وردپرس شما را کنترل میکنند و هر سه باید با هم هماهنگ باشند. حد مؤثر، کوچکترین مقدار میان upload_max_filesize، post_max_size و سقف درخواست وبسرور شماست. اگر یکی را بالا ببرید و دو تای دیگر پایین بمانند، هیچ تغییری رخ نمیدهد — و دقیقاً به همین دلیل است که بیشتر افراد نتیجه میگیرند که راهحلشان «کار نکرد». ابتدا مقادیر فعلی خود را با ابزار حداکثر حجم آپلود وردپرس بررسی کنید؛ این ابزار همان مقادیری را میخواند که خود وردپرس گزارش میدهد و به شما نشان میدهد کدام یک دستوپای شما را بسته است.
چرا این محدودیت وجود دارد و کجا تعریف میشود
وردپرس حد آپلود را تعیین نمیکند. فقط آن را گزارش میدهد. وقتی پیام «The uploaded file exceeds the upload_max_filesize directive in php.ini» را میبینید، این پیام مستقیماً از PHP میآید.
سه مقدار جداگانه یک آپلود را کنترل میکنند و سقف واقعی، هر کدام که کمترین باشد:
upload_max_filesize(PHP) — بزرگترین فایل تکی که PHP میپذیرد.post_max_size(PHP) — بزرگترین کل بدنه POST. فایل شما همراه با سایر فیلدهای فرم درون درخواست POST قرار میگیرد، پس این مقدار باید بزرگتر ازupload_max_filesizeباشد.- حد بدنه وبسرور —
client_max_body_sizeدر Nginx یاLimitRequestBodyدر Apache. این یکی کاملاً خارج از PHP قرار دارد و به همین دلیل است که راهحلهای صرفاً مبتنی بر PHP در پشت Nginx بیسروصدا شکست میخورند.
مقدار چهارمی به نام max_execution_time حجم را محدود نمیکند، اما یک آپلود بزرگ و کند را روی اتصال ضعیف در میانه انتقال قطع میکند. این یک نشانه جداگانه است، نه بخشی از سقف حجم.
تله اینجاست: شما upload_max_filesize = 256M را تنظیم میکنید، دوباره بارگذاری میکنید، اما همچنان نمیتوانید فایل ۱۰۰ مگابایتی آپلود کنید — چون post_max_size هنوز 8M است. PHP درخواست را بر اساس کل بدنه رد میکند، پیش از آنکه اصلاً خودِ فایل را بررسی کند. آن محدودیت شما را نادیده نگرفت. یک محدودیت دیگر زودتر آن را گرفت.
چطور آن را درست کنیم، به ترتیب
از محتملترین راهحل تا آخرین چاره پیش بروید.
۱. ویرایش php.ini (جای درست). فایلی را که سایت شما واقعاً بارگذاری میکند پیدا کنید — یک صفحه با <?php phpinfo(); اجرا کنید و مقدار «Loaded Configuration File» را بخوانید، یا از هاست خود بپرسید. هر دو مقدار PHP را تنظیم کنید و post_max_size را بزرگتر از upload_max_filesize نگه دارید:
upload_max_filesize = 256M
post_max_size = 260M
max_execution_time = 300
PHP-FPM را با sudo systemctl restart php8.2-fpm یا Apache را ریاستارت کنید. تا زمانی که پردازش PHP ریاستارت نشود، تغییرات هیچ اثری ندارند.
۲. به php.ini دسترسی ندارید؟ از .htaccess استفاده کنید (فقط Apache + mod_php). این خطوط را به .htaccess در ریشه وردپرس خود اضافه کنید:
php_value upload_max_filesize 256M
php_value post_max_size 260M
php_value max_execution_time 300
این فقط زمانی کار میکند که PHP بهعنوان یک ماژول Apache اجرا شود. زیر PHP-FPM، CGI یا FastCGI، php_value خطای 500 میدهد — این شکست یعنی مسیر را اشتباه رفتهاید، نه اینکه عدد اشتباه است. به .user.ini سوئیچ کنید:
upload_max_filesize = 256M
post_max_size = 260M
۳. حد وبسرور را بالا ببرید — مرحلهای که همه فراموش میکنند. در Nginx، PHP اصلاً درخواست بیشازحد بزرگ را نمیبیند؛ Nginx زودتر خطای 413 Request Entity Too Large را برمیگرداند. در بلوک سرور خود:
client_max_body_size 256M;
با sudo nginx -t && sudo systemctl reload nginx دوباره بارگذاری کنید. اگر روی Nginx هستید و ویرایشهای PHP شما «هیچ کاری نکرد»، تقریباً همیشه دلیلش همین است.
پس از هر تغییر، مقادیر گزارششده را دوباره بررسی کنید. ابزار حداکثر حجم آپلود سقف مؤثر جدید را به شما میگوید و قطعه کد دقیق را برای پیکربندی شما تولید میکند، تا مجبور نباشید حدس بزنید کدام یک از آن سه هنوز پایین است.
چه کارهایی نباید کرد
wp-config.php را ویرایش نکنید به این امید که حد را بالا ببرد. آن خطی که همهجا کپی میشود، آن کاری را که پستهای وبلاگ ادعا میکنند انجام نمیدهد:
@ini_set( 'upload_max_filesize' , '256M' );
upload_max_filesize از نوع PHP_INI_PERDIR است. نمیتوان آن را در زمان اجرا با ini_set() از داخل PHP تغییر داد. فقط مقادیر جدید را از php.ini، .htaccess یا .user.ini میپذیرد — هرگز از کد برنامه. این خط بدون خطا اجرا میشود و هیچ کاری نمیکند، و همین آن را به یکی از پرتکرارترین توصیههای اشتباه اما با اطمینانگفتهشده در وردپرس تبدیل کرده است.
@ini_set('post_max_size', ...) را هم نچسبانید — همان محدودیت، همان بیاثری خاموش.
WP_MEMORY_LIMIT را تنظیم نکنید به این تصور که همان حد آپلود است. آن سقف حافظه PHP برای اجرای کد را کنترل میکند. هیچ ربطی به اینکه سرور چه حجمی از فایل را میپذیرد ندارد.
در یک فایل متوقف نشوید. رایجترین شکست، تغییر تنها upload_max_filesize و سپس اعلام خراببودن راهحل است. هر سه را تغییر دهید و post_max_size را بالاتر از upload_max_filesize نگه دارید.
حدها را «برای اطمینان» بیجهت بالا نبرید. یک حد ۲ گیگابایتی مشکلات مصرف بیشازحد منابع را بههمراه میآورد و کمکی نمیکند — اگر واقعاً به فایلهای چندگیگابایتی نیاز دارید، آنها را خارج از مرورگر آپلود کنید (SFTP، یا یک افزونه آپلود تکهای) بهجای آنکه آنها را بهزور از یک POST تکی PHP رد کنید.
هنوز گیر کردهاید؟
اگر هر سه مقدار بالا برده شدهاند و باز هم به دیوار میخورید، درخواست جایی بالادست سرور شما محدود میشود: یک CDN یا پراکسی (داشبورد Cloudflare حجم بدنه آپلود را بهطور مستقل محدود میکند)، یک حد پلتفرمی هاست مدیریتشده که php.ini شما را نادیده میگیرد، یا یک .user.ini که هنوز تازهسازی نشده — این فایل به user_ini.cache_ttl در PHP احترام میگذارد، پس ممکن است چند دقیقه پس از ذخیره با تأخیر عمل کند. آنچه سرور واقعاً گزارش میدهد را تأیید کنید، نه آنچه در یک فایل نوشتهاید، و لایهای را که هنوز پایین است اصلاح کنید. وقتی عدد گزارششده سرانجام با هدف شما برابر شد، آپلود کار میکند.
FAQ
پرسشها
چرا وردپرس میگوید فایل آپلودشده از دستور upload_max_filesize در php.ini فراتر رفته است؟
این پیام مستقیماً از PHP میآید، نه از وردپرس — وردپرس حد آپلود را تعیین نمیکند، فقط آن را گزارش میدهد. سه مقدار یک آپلود را کنترل میکنند و کمترینشان برنده است: upload_max_filesize و post_max_size و حد بدنهٔ وبسرور شما، که در Nginx مقدار client_max_body_size و در Apache مقدار LimitRequestBody است.
آیا افزودن ini_set برای upload_max_filesize در wp-config.php حد آپلود را بالا میبرد؟
نه. مقدار upload_max_filesize از نوع PHP_INI_PERDIR است، پس نمیشود آن را در زمان اجرا از کد اپلیکیشن با ini_set() عوض کرد. آن خط بدون خطا اجرا میشود و هیچ کاری نمیکند. فقط از php.ini یا htaccess. یا user.ini. مقدار جدید میپذیرد. همین محدودیت و همین بیاثری بیسروصدا برای post_max_size هم برقرار است.
چرا هنوز هنگام آپلود در وردپرس خطای 413 Request Entity Too Large میگیرم؟
Nginx درخواست را پیش از آنکه اصلاً به PHP برسد رد میکند. مقدار client_max_body_size را در بلوک server خود بالا ببرید، سپس با sudo nginx -t و sudo systemctl reload nginx دوباره بارگذاری کنید. اگر روی Nginx هستید و ویرایشهای PHP شما انگار هیچ اثری نداشت، تقریباً همیشه دلیلش همین است.
آیا post_max_size باید بزرگتر از upload_max_filesize باشد؟
بله. فایل شما همراه با سایر فیلدهای فرم درون درخواست POST قرار میگیرد، پس post_max_size باید بزرگتر از upload_max_filesize باشد. گذاشتن upload_max_filesize روی 256M در حالی که post_max_size روی 8M مانده هیچ تغییری نمیدهد — PHP درخواست را بر اساس کل بدنه رد میکند پیش از آنکه اصلاً فایل را بررسی کند.
چرا php_value در htaccess. خطای 500 میدهد؟
دستور php_value فقط وقتی کار میکند که PHP بهصورت ماژول Apache اجرا شود. زیر PHP-FPM یا CGI یا FastCGI خطای 500 میاندازد، یعنی روش اشتباه است نه عدد. بهجایش سراغ یک فایل user.ini. بروید و upload_max_filesize و post_max_size را آنجا تنظیم کنید.