คำตอบสั้น ๆ: แก้ Error Allowed memory size exhausted ด้วยการเพิ่ม WP_MEMORY_LIMIT และ memory_limit ของ PHP บน Plesk, DirectAdmin หรือ Cloud Server พร้อมค่าที่เหมาะสม
คู่มือนี้อธิบาย Memory Limit ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
เมื่อเว็บ WordPress ขึ้นข้อความ Fatal error: Allowed memory size of 134217728 bytes exhausted หรือหน้าจอ Critical Error ระหว่างอัปโหลดรูป นำเข้าสินค้า WooCommerce หรือเปิดหน้าแก้ไขด้วย Page Builder แปลว่า PHP ใช้หน่วยความจำเกินเพดานที่กำหนดไว้ ตัวเลข 134217728 คือจำนวนไบต์ของเพดาน ซึ่งเท่ากับ 128 MB
หน่วยความจำของ WordPress ถูกควบคุม 2 ชั้น คือค่า memory_limit ของ PHP และค่าคงที่ของ WordPress เอง บทความนี้อธิบายว่าแต่ละชั้นทำงานอย่างไร ควรปรับที่ใดตามประเภทเซิร์ฟเวอร์ และควรตั้งเท่าไหร่จึงไม่กระทบเครื่อง
สิ่งที่ต้องเตรียม (Memory Limit)
- สิทธิ์แก้ไขไฟล์
wp-config.php - สำหรับ Cloud Server หรือ VPS ที่ดูแลเอง: สิทธิ์ SSH และ sudo เพื่อแก้
php.ini - สำหรับ Web Hosting: สิทธิ์เข้า Plesk หรือ DirectAdmin
- สำเนาไฟล์ที่จะแก้ไขก่อนเริ่ม
ทำความเข้าใจค่าหน่วยความจำ 3 ค่า
| ค่า | กำหนดที่ | ค่าเริ่มต้น | ใช้กับ |
|---|---|---|---|
memory_limit | php.ini หรือแผงควบคุม | ขึ้นกับเซิร์ฟเวอร์ (PHP ตั้งมา 128M) | ทุกสคริปต์ PHP |
WP_MEMORY_LIMIT | wp-config.php | 40M (Multisite 64M) | หน้าเว็บฝั่งผู้เข้าชม |
WP_MAX_MEMORY_LIMIT | wp-config.php | 256M | หน้าหลังบ้านและงานหนัก เช่น แก้ไขรูปภาพ |
WordPress จะเพิ่มค่า memory_limit ให้เองขณะทำงาน หากค่าคงที่ของ WordPress สูงกว่าค่าของ PHP แต่จะไม่ลดลงหากค่าของ PHP สูงอยู่แล้ว การเพิ่มนี้ทำได้เฉพาะเมื่อเซิร์ฟเวอร์ไม่ได้ล็อกค่าไว้ ซึ่งบนโฮสติ้งบางแห่งถูกล็อกด้วย php_admin_value ในกรณีนั้นแก้แค่ wp-config.php จะไม่มีผล ต้องแก้ที่ระดับ PHP
ขั้นตอนที่ 1: ดูค่าปัจจุบัน
ไปที่ Tools > Site Health > Info แล้วเปิดหัวข้อ
- Server ดูบรรทัด PHP memory limit
- WordPress Constants ดูบรรทัด WP_MEMORY_LIMIT และ WP_MAX_MEMORY_LIMIT
หรือใช้ WP-CLI (ค่าที่ได้เป็นของ PHP CLI ซึ่งอาจต่างจากเว็บ ให้ถือหน้า Site Health เป็นหลัก)
wp eval 'echo WP_MEMORY_LIMIT . " / " . WP_MAX_MEMORY_LIMIT . " / " . ini_get("memory_limit") . PHP_EOL;'
ขั้นตอนที่ 2: เพิ่มค่าใน wp-config.php
เปิด wp-config.php แล้วเพิ่มก่อนบรรทัด /* That's all, stop editing! Happy publishing. */
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
ใช้ตัวอักษร M ตัวใหญ่ติดกับตัวเลข ไม่เว้นวรรค และไม่เขียน MB ต้องวางไว้ก่อนบรรทัด require_once ABSPATH . 'wp-settings.php'; มิฉะนั้นค่าจะไม่มีผล เพราะ WordPress ใช้ค่าไปแล้ว บันทึกไฟล์แล้วดู Site Health อีกครั้ง หากค่า PHP memory limit ยังไม่เปลี่ยน แปลว่าเซิร์ฟเวอร์ล็อกค่าไว้ ให้ทำขั้นตอนที่ 3
ขั้นตอนที่ 3: เพิ่ม memory_limit ของ PHP
บน Plesk
ไปที่ Websites & Domains เลือกโดเมน แล้วเข้า PHP (บางเวอร์ชันชื่อ PHP Settings) แก้ช่อง memory_limit แล้วคลิก OK หรือ Apply ดูรายละเอียดที่ ปรับค่า PHP (memory_limit, max_execution_time) บน Plesk
บน DirectAdmin
ขึ้นกับการตั้งค่าของเซิร์ฟเวอร์ หากเซิร์ฟเวอร์ใช้ CloudLinux จะมีเมนู Select PHP version ให้เปิดแท็บ Options แล้วแก้ memory_limit หากไม่มีเมนูนี้ ให้ลองวิธีไฟล์ .user.ini ด้านล่าง หรือแจ้งผู้ดูแลเซิร์ฟเวอร์
ด้วยไฟล์ .user.ini (PHP-FPM)
สร้างไฟล์ .user.ini ในโฟลเดอร์รากของเว็บ (โฟลเดอร์เดียวกับ wp-config.php)
memory_limit = 256M
PHP อ่านไฟล์นี้ใหม่ทุก 300 วินาทีตามค่า user_ini.cache_ttl จึงอาจต้องรอประมาณ 5 นาทีจึงเห็นผล วิธีนี้ใช้กับ PHP-FPM และ CGI เท่านั้น
ด้วย .htaccess (เฉพาะ Apache mod_php)
php_value memory_limit 256M
ใช้เฉพาะเมื่อ PHP ทำงานเป็นโมดูลของ Apache หากเซิร์ฟเวอร์ใช้ PHP-FPM คำสั่งนี้จะทำให้เว็บขึ้น 500 Internal Server Error ทันที ให้ลบออกหากเกิดขึ้น
บน Cloud Server ที่ดูแลเอง
หาไฟล์ php.ini ที่ PHP-FPM ใช้
# Ubuntu (เปลี่ยน 8.3 ตามเวอร์ชันในเครื่อง)
sudo nano /etc/php/8.3/fpm/php.ini
# AlmaLinux / Rocky Linux
sudo nano /etc/php.ini
ค้นหาบรรทัด memory_limit แก้เป็น memory_limit = 256M แล้วรีสตาร์ต PHP-FPM
# Ubuntu
sudo systemctl restart php8.3-fpm
# AlmaLinux / Rocky Linux
sudo systemctl restart php-fpm
บน AlmaLinux/Rocky ให้ตรวจไฟล์ Pool /etc/php-fpm.d/www.conf ด้วย หากมีบรรทัด php_admin_value[memory_limit] ค่านั้นจะมีผลเหนือ php.ini และ WordPress จะเปลี่ยนค่าไม่ได้