ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home เพิ่ม Memory Limit ใน WordPress

เพิ่ม Memory Limit ใน WordPress

เมื่อเว็บ 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 เอง บทความนี้อธิบายว่าแต่ละชั้นทำงานอย่างไร ควรปรับที่ใดตามประเภทเซิร์ฟเวอร์ และควรตั้งเท่าไหร่จึงไม่กระทบเครื่อง

สิ่งที่ต้องเตรียม

  • สิทธิ์แก้ไขไฟล์ wp-config.php
  • สำหรับ Cloud Server หรือ VPS ที่ดูแลเอง: สิทธิ์ SSH และ sudo เพื่อแก้ php.ini
  • สำหรับ Web Hosting: สิทธิ์เข้า Plesk หรือ DirectAdmin
  • สำเนาไฟล์ที่จะแก้ไขก่อนเริ่ม

ทำความเข้าใจค่าหน่วยความจำ 3 ค่า

ค่ากำหนดที่ค่าเริ่มต้นใช้กับ
memory_limitphp.ini หรือแผงควบคุมขึ้นกับเซิร์ฟเวอร์ (PHP ตั้งมา 128M)ทุกสคริปต์ PHP
WP_MEMORY_LIMITwp-config.php40M (Multisite 64M)หน้าเว็บฝั่งผู้เข้าชม
WP_MAX_MEMORY_LIMITwp-config.php256Mหน้าหลังบ้านและงานหนัก เช่น แก้ไขรูปภาพ

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 จะเปลี่ยนค่าไม่ได้

ควรตั้งเท่าไหร่

ประเภทเว็บค่าที่มักเพียงพอ
เว็บบริษัท บล็อก ปลั๊กอินไม่มาก128M-256M
WooCommerce, Page Builder, ปลั๊กอินจำนวนมาก256M-512M
งานนำเข้าข้อมูลจำนวนมาก (ชั่วคราว)512M ขึ้นไป แล้วลดกลับหลังเสร็จ

ค่านี้คือเพดานต่อคำขอหนึ่งคำขอ ไม่ใช่หน่วยความจำที่ถูกจองไว้ แต่ในช่วงที่มีผู้เข้าชมพร้อมกันมาก หลาย Process อาจใช้ถึงเพดานพร้อมกัน หากตั้ง 512M และ PHP-FPM เปิด pm.max_children ไว้ 20 เครื่องอาจต้องการหน่วยความจำสูงถึงประมาณ 10 GB ในกรณีเลวร้าย เครื่องที่ RAM ไม่พอจะเริ่มใช้ Swap และช้าลงมาก ตรวจการใช้ RAM ได้ที่ ตรวจสอบ CPU, RAM และ Load Average ของ Linux Server

หมายเหตุ: ถ้าเพิ่มเป็น 512M แล้วยังไม่พอ ปัญหามักไม่ใช่เพดานที่ต่ำเกินไป แต่เป็นปลั๊กอินที่มีจุดรั่วของหน่วยความจำหรือโหลดข้อมูลทั้งตารางมาในครั้งเดียว ให้ดู Path ในข้อความ Error ว่าชี้ไปที่ปลั๊กอินใด ตามวิธีใน แก้ปัญหา "There has been a critical error" ใน WordPress ด้วย WP_DEBUG

ตรวจสอบผลลัพธ์

  • เปิด Tools > Site Health > Info ค่า PHP memory limit และ WP_MEMORY_LIMIT ต้องเป็นค่าใหม่
  • ทำงานที่เคย Error ซ้ำ เช่น อัปโหลดรูปหรือเปิด Page Builder ต้องไม่มีข้อความ Allowed memory size อีก
  • ดู Error Log ว่าไม่มีบรรทัด Allowed memory size ใหม่

ปัญหาที่พบบ่อย

แก้ wp-config.php แล้ว Site Health ยังแสดงค่าเดิม

บรรทัด define อยู่หลัง require_once ABSPATH . 'wp-settings.php'; หรือเซิร์ฟเวอร์ล็อกค่าไว้ ให้ย้ายบรรทัดขึ้นไปด้านบน หรือแก้ที่ระดับ PHP ตามขั้นตอนที่ 3

แก้ php.ini แล้วไม่มีผล

อาจแก้ไฟล์ผิดตัว เช่น แก้ /etc/php/8.3/cli/php.ini ซึ่งใช้กับ Command Line เท่านั้น หรือเว็บใช้ PHP คนละเวอร์ชัน ตรวจด้วยการดูบรรทัด Loaded Configuration File จาก phpinfo() และอย่าลืมรีสตาร์ต PHP-FPM

เว็บขึ้น 500 ทันทีหลังแก้

มักเกิดจากใส่ php_value ใน .htaccess บนเซิร์ฟเวอร์ที่ใช้ PHP-FPM หรือพิมพ์ผิดใน wp-config.php ให้ย้อนไฟล์จากสำเนาแล้วลองวิธีอื่น

หากทำตามขั้นตอนแล้วยังติดปัญหา สามารถติดต่อทีมสนับสนุนของ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security