หนึ่งในปัญหาที่ผู้ใช้ WordPress บน Shared Hosting พบบ่อยที่สุดคือการอัพโหลดไฟล์ไม่ได้ ไม่ว่าจะเป็นรูปภาพขนาดใหญ่ ไฟล์ธีม ปลั๊กอิน หรือไฟล์สื่อต่างๆ ที่เจอข้อความแจ้งเตือนเช่น "The uploaded file exceeds the upload_max_filesize directive in php.ini" หรือ "Sorry, this file type is not permitted for security reasons" ทั้งที่สาเหตุจริงๆ คือ PHP Upload Limit ถูกตั้งค่าไว้ต่ำเกินไปตั้งแต่ต้น บทความนี้รวบรวมวิธีแก้ปัญหาทุกวิธีที่ใช้ได้กับ DirectAdmin Hosting อย่างครบถ้วน พร้อมคำอธิบายว่าแต่ละวิธีเหมาะกับสถานการณ์ไหน

ทำความเข้าใจ PHP Upload Limit ทั้ง 5 ค่า

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

ค่า PHP ค่า Default ความหมาย แนะนำ
upload_max_filesize 2M ขนาดสูงสุดต่อไฟล์ 64M หรือ 128M
post_max_size 8M ขนาด POST request ทั้งหมด 128M (ต้องมากกว่า upload_max_filesize)
memory_limit 128M หน่วยความจำสูงสุดต่อ script 256M
max_execution_time 30 เวลาทำงานสูงสุด (วินาที) 120–300
max_input_time 60 เวลารับข้อมูล input (วินาที) 120–300

กฎสำคัญที่ต้องจำคือ post_max_size ต้องมากกว่า upload_max_filesize เสมอ เพราะ POST request ประกอบด้วยข้อมูลไฟล์บวกกับ metadata ของฟอร์มอีกด้วย ถ้า post_max_size น้อยกว่าหรือเท่ากับ upload_max_filesize จะทำให้ PHP ตัดข้อมูล request ทิ้งก่อนที่จะประมวลผลไฟล์

วิธีที่ 1 — แก้ผ่าน DirectAdmin PHP Configuration

วิธีที่ง่ายที่สุดและแนะนำให้ใช้ก่อนเสมอคือการแก้ตรงจากแผงควบคุม DirectAdmin เพราะไม่ต้องสร้างไฟล์เพิ่มเติม และมีผลกับทุกโฟลเดอร์ในบัญชีโฮสต์ทันที

  1. เข้าสู่ DirectAdmin ด้วย username และ password ของคุณ
  2. ไปที่ Account Manager แล้วคลิก PHP Configuration หรือ PHP Selector
  3. เลือก PHP version ที่ใช้งานอยู่ (เช่น PHP 8.3)
  4. เลื่อนหาค่า upload_max_filesize แล้วเปลี่ยนเป็น 64M หรือ 128M
  5. เปลี่ยนค่า post_max_size ให้สูงกว่า upload_max_filesize (เช่น 128M หรือ 256M)
  6. บันทึกการตั้งค่าแล้วรอสักครู่ให้ระบบรีโหลด PHP

หลังบันทึกแล้วให้ตรวจสอบว่าค่าเปลี่ยนจริงหรือไม่โดยใช้ฟังก์ชัน phpinfo() หรือดูใน WordPress Dashboard ที่ Media > Add New ซึ่งจะแสดงขนาดไฟล์สูงสุดที่รับได้

วิธีที่ 2 — สร้างหรือแก้ไฟล์ php.ini ใน public_html

ถ้าโฮสต์อนุญาตให้สร้างไฟล์ php.ini ในโฟลเดอร์เว็บได้ วิธีนี้จะ override ค่าระดับ server และให้ผลแบบถาวร ไม่หายไปแม้โฮสต์จะ update PHP config ใหม่

สร้างไฟล์ชื่อ php.ini ในโฟลเดอร์ public_html (หรือ directory root ของเว็บ) แล้วใส่เนื้อหาดังนี้:

upload_max_filesize = 128M
post_max_size = 256M
memory_limit = 256M
max_execution_time = 300
max_input_time = 300

บันทึกไฟล์แล้วทดสอบโดยสร้างไฟล์ PHP ทดสอบชื่อ info.php ใน public_html:

<?php phpinfo(); ?>

เปิดที่ https://yourdomain.com/info.php แล้วค้นหาคำว่า upload_max_filesize ดูว่าแสดงค่าใหม่หรือไม่ ถ้าแสดงค่าเดิมแสดงว่าโฮสต์นั้นไม่รองรับ php.ini ในโฟลเดอร์ ให้ลองวิธีถัดไป และอย่าลืมลบ info.php ออกหลังทดสอบเสมอเพราะเป็นความเสี่ยงด้านความปลอดภัย

วิธีที่ 3 — ใช้ .user.ini (สำหรับ PHP-FPM)

โฮสต์สมัยใหม่ส่วนใหญ่ใช้ PHP-FPM (FastCGI Process Manager) แทน mod_php ทำให้การใช้ php_value ใน .htaccess ไม่มีผล ในกรณีนี้ต้องใช้ไฟล์ .user.ini แทน ซึ่งมีรูปแบบเหมือนกับ php.ini ทุกประการ

สร้างไฟล์ชื่อ .user.ini (มีจุดนำหน้า) ใน public_html แล้วใส่:

upload_max_filesize = 128M
post_max_size = 256M
memory_limit = 256M
max_execution_time = 300
max_input_time = 300

ข้อสำคัญของ .user.ini คือจะมีผลเฉพาะใน directory นั้นและ subdirectory ที่อยู่ข้างใต้เท่านั้น และ PHP จะอ่านค่าใหม่หลังจากผ่าน TTL (cache time) ซึ่งโดย default คือ 300 วินาที ดังนั้นหลังสร้างไฟล์แล้วอาจต้องรอสักครู่ก่อนที่ค่าจะมีผล

เคล็ดลับ: ถ้าคุณไม่แน่ใจว่าโฮสต์ใช้ mod_php หรือ PHP-FPM ให้ลองสร้างทั้ง php.ini และ .user.ini พร้อมกันในโฟลเดอร์เดียวกัน PHP จะใช้ไฟล์ที่ถูกต้องตามประเภทของการรันอัตโนมัติ การมีทั้งสองไฟล์จะครอบคลุมทั้งสองกรณีโดยไม่เกิดความขัดแย้ง

วิธีที่ 4 — แก้ใน .htaccess ด้วย php_value

วิธีนี้ใช้ได้กับโฮสต์ที่รัน PHP ผ่าน Apache mod_php เท่านั้น ให้เปิดไฟล์ .htaccess ที่ root ของ WordPress (โดยปกติอยู่ที่ public_html/.htaccess) แล้วเพิ่มบรรทัดเหล่านี้ต่อท้าย:

php_value upload_max_filesize 128M
php_value post_max_size 256M
php_value memory_limit 256M
php_value max_execution_time 300
php_value max_input_time 300

ถ้าโฮสต์ไม่รองรับ php_value ใน .htaccess เซิร์ฟเวอร์จะส่ง Error 500 กลับมา ในกรณีนี้ให้ลบบรรทัดเหล่านั้นออกทันทีแล้วใช้วิธีอื่นแทน คุณสามารถทดสอบก่อนว่าโฮสต์รองรับหรือไม่โดยเพิ่มแค่บรรทัดเดียวก่อน แล้วโหลดหน้าเว็บดูว่ายังทำงานปกติหรือเกิด Error 500

วิธีที่ 5 — แก้ผ่าน wp-config.php

WordPress มี constant ที่ช่วยตั้งค่า memory limit ได้เพิ่มเติม แม้จะไม่ได้ตั้งค่า PHP โดยตรง แต่ก็ช่วยในกรณีที่ WordPress ใช้ memory เกิน limit ที่ตั้งไว้ เปิดไฟล์ wp-config.php แล้วเพิ่มก่อนบรรทัด require_once ABSPATH . 'wp-settings.php';:

/** WordPress Memory Limit */
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );

ค่า WP_MEMORY_LIMIT ใช้สำหรับ front-end ของเว็บ ส่วน WP_MAX_MEMORY_LIMIT ใช้สำหรับ WordPress admin panel ซึ่งต้องการ memory มากกว่า ทั้งสองค่านี้จะไม่มีผลถ้า PHP memory_limit ที่ตั้งไว้ใน php.ini ต่ำกว่า เพราะ PHP จะ enforce ค่าต่ำกว่าเสมอ

นอกจากนี้ถ้าต้องการเพิ่ม max upload size ผ่าน filter ของ WordPress เองก็ทำได้โดยเพิ่ม code ใน functions.php ของ theme:

add_filter( 'upload_size_limit', function( $size ) {
    return 128 * 1024 * 1024; // 128MB in bytes
});

อย่างไรก็ตาม filter นี้จะไม่สามารถเพิ่มค่าเกินกว่าที่ PHP อนุญาตได้ มันทำได้แค่ลดค่าให้ต่ำลง ดังนั้นต้องแก้ PHP limit ก่อนเสมอ

วิธีที่ 6 — ตรวจสอบค่าปัจจุบันและ Debug

ก่อนและหลังแก้ไข ควรตรวจสอบว่าค่าเปลี่ยนจริงหรือไม่ด้วยวิธีต่อไปนี้

ตรวจสอบผ่าน WordPress Dashboard

เข้าไปที่ Media > Add New ใน WordPress admin แล้วดูข้อความ "Maximum upload file size:" ที่แสดงอยู่ด้านล่าง ถ้าค่ายังเป็นเดิม (เช่น 2 MB หรือ 8 MB) แสดงว่าการแก้ไขยังไม่มีผล

ตรวจสอบผ่าน phpinfo()

สร้างไฟล์ PHP ชั่วคราวชื่อ check.php แล้วใส่:

<?php
echo 'upload_max_filesize: '.ini_get('upload_max_filesize').'<br>';
echo 'post_max_size: '.ini_get('post_max_size').'<br>';
echo 'memory_limit: '.ini_get('memory_limit').'<br>';
echo 'max_execution_time: '.ini_get('max_execution_time').'<br>';
?>

เปิดที่ https://yourdomain.com/check.php ดูว่าค่าที่แสดงตรงกับที่ตั้งไว้หรือไม่ อย่าลืมลบไฟล์นี้ออกหลังทดสอบทุกครั้ง

ลำดับความสำคัญ (Priority) ของไฟล์ configuration

PHP อ่านค่า configuration จากหลายแหล่งโดยมีลำดับความสำคัญดังนี้ (ค่าล่างสุดจะ override ค่าบนสุด):

  1. php.ini ระดับ server (กำหนดโดยผู้ดูแลเซิร์ฟเวอร์)
  2. php.ini หรือ .user.ini ในโฟลเดอร์ของผู้ใช้
  3. php_value ใน .htaccess (เฉพาะ mod_php)
  4. ini_set() ในโค้ด PHP (สำหรับค่าที่อนุญาตให้แก้ได้)

แก้ปัญหาเพิ่มเติม — กรณีที่ยังอัพโหลดไม่ได้แม้แก้แล้ว

บางครั้งแม้จะแก้ค่า PHP แล้วก็ยังอัพโหลดไม่ได้ ให้ตรวจสอบสาเหตุอื่นๆ เหล่านี้ด้วย:

ปัญหา Nginx Client Max Body Size

ถ้าโฮสต์ใช้ Nginx เป็น reverse proxy อยู่หน้า Apache/PHP อาจมีค่า client_max_body_size ที่จำกัดขนาด request ก่อนที่จะถึง PHP เลย ในกรณีนี้ต้องติดต่อโฮสต์เพื่อให้ปรับค่านี้ให้ด้วย เพราะผู้ใช้ทั่วไปไม่สามารถแก้ไขได้เอง

ปัญหา WordPress Nonce Timeout

ถ้าอัพโหลดไฟล์ขนาดใหญ่แล้วได้รับข้อผิดพลาดเกี่ยวกับ security token ให้ลองเพิ่ม max_execution_time และ max_input_time ให้มากขึ้น เพราะ WordPress จะหมดเวลาของ nonce ระหว่างที่รอไฟล์อัพโหลด

ปัญหา Disk Space เต็ม

ตรวจสอบพื้นที่ disk ที่เหลือใน DirectAdmin ที่ System Info & Files ถ้าพื้นที่เหลือน้อยหรือเต็ม WordPress จะไม่สามารถบันทึกไฟล์ที่อัพโหลดได้ แม้จะผ่านขั้นตอน PHP แล้วก็ตาม

ปัญหา Permission โฟลเดอร์ wp-content/uploads

โฟลเดอร์สำหรับอัพโหลดต้องมีสิทธิ์ 755 (directory) และ 644 (file) ตรวจสอบและแก้ไขด้วย File Manager ใน DirectAdmin หรือผ่าน FTP ถ้า permission ไม่ถูกต้อง WordPress จะไม่สามารถเขียนไฟล์ลงได้แม้จะมีพื้นที่เหลือก็ตาม

# แก้ permission ผ่าน FTP หรือ SSH shell
chmod 755 wp-content/uploads
find wp-content/uploads -type f -exec chmod 644 {} \;
find wp-content/uploads -type d -exec chmod 755 {} \;

ค่าที่แนะนำสำหรับ WordPress Hosting สมัยใหม่

สำหรับเว็บ WordPress ที่ต้องการใช้งานได้อย่างราบรื่น ค่า PHP ที่แนะนำมีดังนี้ ซึ่งเป็นค่ามาตรฐานสำหรับเว็บทั่วไป ถ้าใช้ปลั๊กอินหนัก เช่น WooCommerce หรือ page builder อาจต้องการ memory_limit สูงกว่านี้

# ค่าแนะนำสำหรับ WordPress ทั่วไป
upload_max_filesize = 128M
post_max_size = 256M
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
max_input_vars = 5000

ค่า max_input_vars ที่เพิ่มมาด้วย 5000 มีความสำคัญมากสำหรับ WordPress ที่ใช้ปลั๊กอินหลายตัว เพราะ option page และ settings form อาจมีจำนวน input field เกิน 1000 ตัว ถ้าค่าต่ำเกินไป การบันทึกการตั้งค่าจะทำงานไม่ครบถ้วน

คำถามที่พบบ่อย (FAQ)

ทำไม WordPress ถึงอัพโหลดไฟล์ไม่ได้ ทั้งที่ขนาดไฟล์ไม่ใหญ่มาก

WordPress มีข้อจำกัดหลายชั้น ทั้ง upload_max_filesize, post_max_size, memory_limit และ max_execution_time ถ้าค่าใดค่าหนึ่งต่ำกว่าขนาดไฟล์ที่อัพโหลด ระบบจะปฏิเสธการอัพโหลดทันที นอกจากนี้ค่า post_max_size ต้องมากกว่า upload_max_filesize เสมอ มิฉะนั้นข้อมูล POST จะตัดทอนก่อนถึง PHP

แก้ php.ini บน DirectAdmin ต้องทำที่ไหน

ใน DirectAdmin ให้เข้าไปที่ Account Manager > PHP Configuration หรือ Extra Features > PHP Settings แล้วแก้ค่า upload_max_filesize และ post_max_size ตรงนั้นได้เลย หรือจะสร้างไฟล์ php.ini ในโฟลเดอร์ public_html เพื่อ override ค่า server-level ก็ได้ บางโฮสต์ยังรองรับ .user.ini อีกด้วย

ค่า upload_max_filesize กับ post_max_size ต่างกันอย่างไร

upload_max_filesize คือขนาดสูงสุดของแต่ละไฟล์ที่อัพโหลดได้ต่อครั้ง ส่วน post_max_size คือขนาดสูงสุดของ HTTP POST request ทั้งหมด ซึ่งรวมทุกไฟล์ที่อัพโหลดพร้อมกันบวกกับข้อมูล form อื่นๆ ด้วย ดังนั้น post_max_size ต้องมากกว่า upload_max_filesize เสมอ เช่น upload = 64M ควรตั้ง post = 128M

แก้ใน .htaccess แล้วยังไม่ได้ผล ต้องทำอย่างไร

การแก้ด้วย .htaccess ใช้ php_value จะได้ผลก็ต่อเมื่อเซิร์ฟเวอร์ใช้ PHP แบบ mod_php เท่านั้น ถ้าโฮสต์ใช้ PHP-FPM หรือ CGI วิธีนี้จะไม่มีผล ให้ลองใช้ไฟล์ .user.ini แทน โดยใส่ค่าเหมือนกับ php.ini และวางไว้ใน public_html หรือโฟลเดอร์ที่ต้องการ

Hosting DirectAdmin ครบชุดของ AsiaGB

AsiaGB Hosting รองรับ DirectAdmin เต็มรูปแบบ PHP 8.3 MySQL เริ่มต้น 500 บาท/ปี

ดูแพ็กเกจ Hosting