ข้ามไปยังเนื้อหา
การตั้งค่า

เพิ่มขนาดไฟล์อัพโหลดสูงสุดใน WordPress

มีค่าตั้งค่าอยู่สามตัวที่ควบคุมขีดจำกัดการอัพโหลดของ WordPress และทั้งสามตัวต้องสอดคล้องกัน ขีดจำกัดที่ใช้จริงคือค่าที่น้อยที่สุดในบรรดา upload_max_filesize, post_max_size

เผยแพร่แล้ว

มีค่าตั้งค่าอยู่สามตัวที่ควบคุมขีดจำกัดการอัพโหลดของ WordPress และทั้งสามตัวต้องสอดคล้องกัน ขีดจำกัดที่ใช้ได้จริงคือค่าที่ น้อยที่สุด ในบรรดา upload_max_filesize, post_max_size และเพดานขนาดคำขอของเว็บเซิร์ฟเวอร์ ถ้าคุณเพิ่มแค่ตัวเดียวแล้วปล่อยอีกสองตัวไว้ต่ำ ก็จะไม่มีอะไรเปลี่ยน ซึ่งนี่แหละคือเหตุผลที่คนส่วนใหญ่สรุปว่าวิธีที่ตัวเองแก้ “ไม่ได้ผล” ลองเช็กค่าปัจจุบันของคุณก่อนด้วย เครื่องมือตรวจขนาดอัพโหลดสูงสุดของ WordPress มันจะอ่านค่าเดียวกับที่ WordPress รายงานและบอกคุณว่าตัวไหนที่กำลังฉุดคุณอยู่

ทำไมถึงมีขีดจำกัดนี้ และมันอยู่ตรงไหน

WordPress ไม่ได้เป็นตัวกำหนดขีดจำกัดการอัพโหลด มันแค่รายงานเท่านั้น เวลาที่คุณเห็นข้อความ “The uploaded file exceeds the upload_max_filesize directive in php.ini” ข้อความนั้นมาจาก PHP ตรง ๆ

มีค่าอยู่สามตัวที่แยกกันควบคุมการอัพโหลด และเพดานจริงคือตัวที่ต่ำที่สุด:

  • upload_max_filesize (PHP) — ขนาดไฟล์เดี่ยวที่ใหญ่ที่สุดที่ PHP จะยอมรับ
  • post_max_size (PHP) — ขนาด POST body รวมที่ใหญ่ที่สุด ไฟล์ของคุณเดินทางไปพร้อมกับคำขอ POST รวมกับฟิลด์อื่น ๆ ในฟอร์ม ดังนั้นค่านี้จึงต้องใหญ่กว่า upload_max_filesize
  • ขีดจำกัด body ของเว็บเซิร์ฟเวอร์ — คือ client_max_body_size บน Nginx หรือ LimitRequestBody บน Apache ค่านี้อยู่นอกเหนือ PHP โดยสิ้นเชิง ซึ่งเป็นเหตุผลว่าทำไมการแก้เฉพาะฝั่ง PHP ถึงล้มเหลวแบบเงียบ ๆ เมื่ออยู่หลัง Nginx

ยังมีค่าตัวที่สี่คือ max_execution_time ซึ่งไม่ได้จำกัดขนาด แต่จะยกเลิกการอัพโหลดไฟล์ใหญ่ที่ช้ากลางคันเมื่อการเชื่อมต่อไม่ดี มันเป็นอาการคนละเรื่อง ไม่ใช่ส่วนหนึ่งของเพดานขนาด

กับดักก็คือ คุณตั้ง upload_max_filesize = 256M แล้วรีโหลด แต่ก็ยังอัพโหลดไฟล์ 100 MB ไม่ได้ เพราะ post_max_size ยังเป็น 8M อยู่ PHP ปฏิเสธคำขอตั้งแต่ดูขนาด body รวม ก่อนที่มันจะได้ตรวจตัวไฟล์เสียอีก ขีดจำกัดไม่ได้เพิกเฉยต่อคุณหรอก แต่มีขีดจำกัด อีกตัว ที่ดักไว้ก่อน

วิธีแก้ ตามลำดับ

ทำจากวิธีที่มีโอกาสได้ผลมากที่สุดไปหาทางเลือกสุดท้าย

1. แก้ 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 จะรีสตาร์ท

2. เข้าถึง php.ini ไม่ได้? ใช้ .htaccess (เฉพาะ Apache + mod_php เท่านั้น) เพิ่มลงใน .htaccess ที่ราก WordPress ของคุณ:

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 จะทำให้เกิด error 500 ความล้มเหลวนั้นหมายความว่าคุณมาผิดทาง ไม่ได้แปลว่าตัวเลขผิด ให้เปลี่ยนไปใช้ .user.ini แทน:

upload_max_filesize = 256M
post_max_size = 260M

3. เพิ่มขีดจำกัดของเว็บเซิร์ฟเวอร์ — ขั้นตอนที่ทุกคนลืม บน 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 มันไม่สามารถถูกเปลี่ยนจาก PHP ระหว่างรันไทม์ด้วย ini_set() ได้ มันรับค่าใหม่ได้จาก php.ini, .htaccess หรือ .user.ini เท่านั้น ไม่มีทางรับจากโค้ดของแอปพลิเคชัน บรรทัดนี้รันโดยไม่มี error และไม่ทำอะไรเลย ซึ่งทำให้มันกลายเป็นหนึ่งในคำแนะนำผิด ๆ ที่คนพูดกันอย่างมั่นใจที่สุดในโลก WordPress

อย่าวาง @ini_set('post_max_size', ...) เช่นกัน ข้อจำกัดเดียวกัน ไม่ทำอะไรแบบเงียบ ๆ เหมือนกัน

อย่าตั้ง WP_MEMORY_LIMIT แล้วคิดว่ามันคือขีดจำกัดการอัพโหลด ค่านั้นควบคุมเพดานหน่วยความจำของ PHP สำหรับการรันโค้ด ไม่เกี่ยวข้องกับว่าเซิร์ฟเวอร์จะยอมรับไฟล์ขนาดใหญ่แค่ไหน

อย่าหยุดแค่ไฟล์เดียว ความล้มเหลวที่พบบ่อยที่สุดคือการเปลี่ยนแค่ upload_max_filesize ตัวเดียวแล้วประกาศว่าวิธีแก้ใช้ไม่ได้ ให้เปลี่ยนทั้งสามตัว และให้ post_max_size สูงกว่า upload_max_filesize เสมอ

อย่าตั้งขีดจำกัดสูงลิ่ว “เผื่อไว้ให้ชัวร์” ขีดจำกัด 2 GB เชิญปัญหาทรัพยากรหมดเข้ามาและไม่ได้ช่วยอะไร ถ้าคุณต้องใช้ไฟล์ขนาดหลายกิกะไบต์จริง ๆ ให้อัพโหลดมันนอกเบราว์เซอร์ (ผ่าน SFTP หรือปลั๊กอิน wordpress แบบ chunked-upload) แทนที่จะพยายามยัดมันผ่าน POST ของ PHP ครั้งเดียว

ยังติดอยู่ใช่ไหม?

ถ้าคุณเพิ่มค่าทั้งสามตัวแล้วแต่ยังชนกำแพงอยู่ แสดงว่าคำขอถูกจำกัดอยู่ที่ไหนสักแห่งเหนือเซิร์ฟเวอร์ของคุณ ไม่ว่าจะเป็น CDN หรือพร็อกซี (แดชบอร์ดของ Cloudflare จำกัดขนาด body ของการอัพโหลดด้วยตัวมันเอง) ขีดจำกัดระดับแพลตฟอร์มของโฮสต์แบบ managed ที่เพิกเฉยต่อ php.ini ของคุณ หรือ .user.ini ที่ยังไม่รีเฟรช เพราะมันเคารพค่า user_ini.cache_ttl ของ PHP มันจึงอาจล่าช้าไปสองสามนาทีหลังจากที่คุณบันทึก ให้ยืนยันว่าเซิร์ฟเวอร์รายงานค่าอะไรจริง ๆ ไม่ใช่ค่าที่คุณเขียนลงในไฟล์ แล้วแก้เลเยอร์ที่ยังต่ำอยู่ เมื่อตัวเลขที่รายงานตรงกับเป้าหมายของคุณในที่สุด การอัพโหลดก็จะทำงานได้