پرش به محتوا
پیکربندی

افزایش حداکثر حجم آپلود فایل در وردپرس

سه تنظیم حجم آپلود وردپرس را کنترل می‌کنند و هر سه باید با هم هماهنگ باشند. حد واقعی، کوچک‌ترین مقدار میان 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 احترام می‌گذارد، پس ممکن است چند دقیقه پس از ذخیره با تأخیر عمل کند. آنچه سرور واقعاً گزارش می‌دهد را تأیید کنید، نه آنچه در یک فایل نوشته‌اید، و لایه‌ای را که هنوز پایین است اصلاح کنید. وقتی عدد گزارش‌شده سرانجام با هدف شما برابر شد، آپلود کار می‌کند.