📑 Daftar Isi
- Kenapa Error Ini Selalu Muncul?
- 7 Solusi Fix PHP Memory Limit Exhausted Error
- Solusi 1: Cek Memory Limit Saat Ini
- Solusi 2: Edit php.ini (Permanent Fix)
- Solusi 3: Fix via .htaccess atau .user.ini
- Solusi 4: Fix Khusus WordPress
- Solusi 5: Pakai ini_set() Per-Script
- Solusi 6: Profiling — Cari Kode yang Boros Memori
- Solusi 7: Optimasi Server-Level
- Troubleshooting Table
- Nilai Memory Limit yang Direkomendasikan
- Kenapa Naikkan Memory Limit Saja Gak Cukup
- FAQ
Berhenti googling “PHP memory limit exhausted” tiap minggu. Serius nih. Aku udah lihat error ini muncul di production server berkali-kali, dan tiap kali tetep bikin gemas. Error-nya selalu sama: Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes). Masalahnya selalu sama, dan sebenarnya gampang banget dicegah — kalau sampeyan mau belajar sekali aja. Tolong ya, jangan ngulang kesalahan yang sama terus-terusan.
Bayangkan kamu lagi antre di ATM, udah 30 menit nunggu, eh pas giliran kamu, mesinnya nolak transaksi karena limit harian habis. Frustrating banget kan? Nah, PHP memory limit itu kurang lebih kayak gitu. Script kamu lagi jalan-jalan enak, query database ini itu, proses upload gambar, generate PDF, olah data CSV — eh tiba-tiba crash karena kehabisan “budget” memori. Dan kalau ini terjadi di production environment, dampaknya bukan cuma error page yang muncul di browser user. Ada revenue loss, ada trust yang runtuh, ada ticket support yang membanjir, dan kalau ini terus terjadi berulang-ulang, siap-siap terima surat cinta seko management. Soalnya ini production server, bukan environment dev yang bisa kamu restart seenaknya.
Kenapa Error Ini Selalu Muncul?
PHP memory limit itu sebenarnya mekanisme proteksi. Tanpa batas ini, satu script yang rusak bisa makan seluruh RAM server dan bikin service lain mati — Apache, Nginx, MySQL, semua bisa kena. Jadi PHP kasih default limit, biasanya 128M atau 256M, dan kalau script kamu melebihi batas itu, boom — fatal error. Ini bukan bug, ini fitur. Tapi masalahnya, banyak yang gak ngerti kenapa script mereka bisa makan memori sebanyak itu.
Common causes yang paling sering aku lihat di lapangan itu gini: pertama, upload file besar tanpa validasi ukuran — user upload gambar 10MB dari DSLR, PHP coba proses semua di memori. Kedua, WooCommerce atau plugin WordPress yang load data terlalu banyak sekaligus — misalnya order export 5000 baris langsung. Ketiga, memory leak di custom code yang gak ketahuan — script yang dijalankan berulang kali (cron job tiap menit) tapi gak pernah cleanup variable. Keempat, konfigurasi default yang terlalu rendah untuk workload server tertentu. Kelima, image processing library seperti GD atau Imagick yang makan banyak memori buat resize gambar berukuran besar. Semua ini sering terjadi di production, dan kalau gak ditangani, error ini akan muncul lagi dan lagi.

7 Solusi Fix PHP Memory Limit Exhausted Error
Oke, saiki kita masuk ke solusi. Aku urutkan dari yang paling gampang sampai yang lebih advanced. Ikuti berurutan ya, jangan loncat-loncat. Dan yang penting: sebelum ubah config apapun, SELALU backup dulu file config yang asli. Tolong jangan skip bagian ini. Kalau kamu edit php.ini tanpa backup, dan ternyata syntax-nya salah, seluruh website bisa down. Aku pernah lihat kasus begini, dan recovery-nya butuh waktu lebih lama daripada proses backup 5 menit.
Solusi 1: Cek Memory Limit Saat Ini
Sebelum otak-atik apapun, cek dulu limit sekarang berapa. Jangan nebak. Banyak yang bilang “udah saya set 512M” ternyata set-nya di file yang salah, atau ada config lain yang override. Login ke server, buat file PHP info:
cat > /var/www/html/phpinfo.php <<'EOF'
<?php phpinfo(); ?>
EOF
Buka browser, akses http://domain-kamu.com/phpinfo.php, cari baris memory_limit. Catat nilainya dan catat juga path file php.ini yang aktif — biasanya ada di kolom Loaded Configuration File. Kalau udah selesai, hapus file phpinfo.php ini. Jangan biarkan publicly accessible, karena info ini bisa dimanfaatkan attacker.
Alternatif lain, kalau kamu punya akses CLI, langsung jalanin:
php -i | grep memory_limit
Atau kalau mau lebih spesifik:
php -r "echo ini_get('memory_limit');"
Hasilnya? Misalnya 128M. Nah, kalau error message-nya bilang exhausted di angka 134217728 bytes (yang artinya 128MB), berarti memory_limit kamu memang kurang. Lanjut ke solusi berikutnya.
Solusi 2: Edit php.ini (Permanent Fix)
Ini solusi paling umum dan paling reliable. Edit file php.ini, naikkan memory_limit. Tapi perhatiin: kamu harus edit file php.ini yang BENAR. Ada banyak php.ini di server — satu untuk CLI, satu untuk web, dan kadang ada per-version.
Cari file php.ini yang aktif:
php --ini | grep "Loaded Configuration File"
Output-nya kira-kira gini:
Loaded Configuration File: /etc/php/8.2/fpm/php.ini
Backup dulu, baru edit:
cp /etc/php/8.2/fpm/php.ini /etc/php/8.2/fpm/php.ini.bak.bak
nano /etc/php/8.2/fpm/php.ini
Cari baris memory_limit dan ganti:
; Before
memory_limit = 128M
; After
memory_limit = 512M
Simpan file, lalu restart PHP-FPM:
# Untuk PHP 8.2 FPM
systemctl restart php8.2-fpm
# Atau kalau pakai PHP 7.4
systemctl restart php7.4-fpm
# Atau kalau pakai mod PHP di Apache
systemctl restart apache2
Setelah restart, verifikasi perubahannya:
php -r "echo ini_get('memory_limit');"
Harusnya sekarang tampil 512M. Kalau masih 128M, kemungkinan kamu edit file php.ini yang salah — cek lagi path-nya. Atau ada file konfigurasi lain yang override. Di beberapa distro, ada direktori /etc/php/8.2/fpm/conf.d/ yang isinya file .ini lain yang bisa override setting di php.ini utama. Cek juga situ.
Solusi 3: Fix via .htaccess atau .user.ini
Kalau kamu gak punya akses edit php.ini (misalnya di shared hosting), ada alternatif lain. Untuk Apache, kamu bisa pakai .htaccess:
# Tambahkan di file .htaccess di root website
php_value memory_limit 512M
Atau kalau pakai LiteSpeed/Nginx dengan .user.ini support:
# Buat atau edit file .user.ini di root website
memory_limit = 512M
Catatan penting: .htaccess hanya works di Apache dengan mod_php atau suPHP. Kalau kamu pakai PHP-FPM + Nginx, .htaccess gak akan di-read — kamu harus pakai .user.ini atau edit php.ini langsung. Dan kalau pakai LiteSpeed, .user.ini otomatis di-cache, jadi setelah edit kamu perlu tunggu beberapa menit atau restart LiteSpeed.
Juga perlu diketahui: beberapa shared hosting gak mengizinkan override memory_limit pakai .htaccess karena limit server-side udah di-lock oleh admin. Kalau kamu edit .htaccess tapi error tetap muncul, kemungkinan besar hosting kamu gak ngizinin override ini. Solusinya? Hubungi provider hosting, atau naikkan ke VPS biar lebih bebas konfigurasi. Soalnya di shared hosting, kamu berbagi resources sama user lain, jadi wajar kalau ada batasan.
Solusi 4: Fix Khusus WordPress
WordPress itu salah satu CMS yang paling sering kena PHP memory limit error. Terutama kalau pakai WooCommerce, Elementor, atau plugin berat lainnya. Fix-nya bisa dilakukan di wp-config.php:
// Buka file wp-config.php, cari atau tambahkan baris ini
define('WP_MEMORY_LIMIT', '512M');
define('WP_MAX_MEMORY_LIMIT', '512M');
Taruh di atas baris /* That's all, stop editing! */. WP_MEMORY_LIMIT itu buat frontend, WP_MAX_MEMORY_LIMIT itu buat admin backend. Biasanya backend butuh lebih banyak karena proses upload media, import data, dll.
Tapi perlu diingat: fix ini cuma work kalau PHP di server kamu mengizinkan limit di atas yang kamu set. Misalnya kalau php.ini memory_limit = 128M, dan kamu set WP_MEMORY_LIMIT = 512M, tetap aja gak akan jalan karena PHP gak akan mengizinkan script makan lebih dari 128M. Jadi harus dua-duanya di-set: php.ini DAN wp-config.php. Banyak yang lupa bagian ini, terus heran kok tetap error.
Cara lain yang bisa dicoba untuk WordPress: nonaktifkan plugin satu per satu untuk cari tahu plugin mana yang makan banyak memori. Kadang masalahnya bukan di memory limit yang kurang, tapi di plugin yang leak memory. Mulai dari plugin yang paling “berat” — biasanya page builder, WooCommerce extensions, atau plugin analytics. Nonaktifkan satu per satu, test, dan lihat apakah error masih muncul.
Solusi 5: Pakai ini_set() Per-Script
Kalau kamu cuma butuh naikkan memory limit untuk script tertentu (bukan global), bisa pakai ini_set() di awal script:
<?php
ini_set('memory_limit', '512M');
// Sisa kode script kamu di sini
// ...
Cara ini bagus untuk script cron job atau batch processing yang memang butuh banyak memori, tapi kamu gak mau naikkan limit global karena alasan keamanan. Ingat, memory limit itu proteksi. Kalau kamu naikkan global ke 2G, satu script nakal aja bisa makan semua RAM server dan bikin service lain mati. Jadi untuk script tertentu, pakai ini_set() aja. Tapi ini cuma works kalau php.ini mengizinkan per-script override — cek setting allow_url_fopen dan pastikan gak ada restriction lain.
Oh ya, satu lagi yang sering dilupakan: ini_set() cuma bisa menurunkan memory limit, bukan menaikkannya, KECUALI php.ini udah set lebih tinggi. Artinya kalau php.ini = 128M, kamu gak bisa set 512M lewat ini_set(). Tapi kalau php.ini = 2G, kamu bisa set 512M dari script untuk batasi script tertentu. Ini yang banyak gak diketahui developer junior.
Solusi 6: Profiling — Cari Kode yang Boros Memori
Nah, ini yang paling sering dilupakan tapi sebenarnya paling penting. Daripada terus naikkan memory limit, kenapa gak cari aja kode yang boros memori dan fix dari akarnya? Karena kalau kamu terus naikkan limit, suatu saat kamu akan sampai di batas RAM server, dan solusinya cuma upgrade hardware — yang artinya biaya lebih.
Cara profiling memori di PHP:
<?php
// Di awal script
echo 'Memory usage: ' . memory_get_usage() . ' bytesn';
// ... kode kamu di sini ...
// Di akhir script
echo 'Peak memory usage: ' . memory_get_peak_usage() . ' bytesn';
Atau kalau mau lebih detail, pakai Xdebug profiler. Install Xdebug, aktifkan profiling, dan analisis hasilnya pakai tools seperti KCachegrind atau QCachegrind. Output-nya bakal kasih tahu kamu function mana yang paling banyak makan memori dan berapa lama execution time-nya.
Tanda-tanda kode yang boros memori itu gini: loop yang load semua data sekaligus dari database tanpa pagination, variable besar yang gak di-unset setelah dipakai, string concatenation di dalam loop yang bikin string makin lama makin besar, atau penggunaan image processing yang gak di-optimize. Contohnya: kamu load 10.000 row dari database ke array, terus proses satu per satu. Semua 10.000 row itu nongkrong di memori sekaligus. Padahal bisa pakai pagination atau generator function supaya cuma load 100 row dalam satu waktu.
Solusi 7: Optimasi Server-Level
Kalau semua solusi di atas udah dicoba tapi error masih muncul, mungkin masalahnya bukan di script tertentu tapi di konfigurasi server secara keseluruhan. Beberapa hal yang bisa dioptimasi:
OPcache: Aktifkan OPcache kalau belum aktif. OPcache caching bytecode PHP, jadi script gak perlu di-parse ulang setiap request. Ini mengurangi memory usage secara signifikan. Edit php.ini:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
PHP-FPM tuning: Kalau pakai PHP-FPM, pastikan pm.max_children di-set dengan tepat. Terlalu banyak child processes = terlalu banyak memory yang terpakai. Formula kasar: max_children = (Total RAM – RAM untuk OS/MySQL/other services) / RAM per PHP process. Kamu bisa cek berapa memory per process pakai ps aux | grep php-fpm.
Switch ke LiteSpeed: Kalau server kamu pakai Apache, pertimbangkan switch ke LiteSpeed. LiteSpeed lebih efisien dalam hal memory usage karena event-driven architecture. Banyak yang report penurunan memory usage 30-50% setelah switch ke LiteSpeed, dan ini langsung mengurangi frekuensi PHP memory limit error. Artikel tentang migrasi Apache ke LiteSpeed udah banyak, tapi kalau kamu butuh panduan spesifik, cek juga konfigurasi migrasi dari Apache ke LiteSpeed yang udah kami tulis.
Troubleshooting Table
Nih, tabel cepat buat diagnose masalah kamu. Cocokin error message kamu sama situasi di tabel, terus ikuti solusinya.
| Error Message Pattern | Kemungkinan Penyebab | Solusi Utama | Prioritas |
|---|---|---|---|
| Allowed memory size of 128M exhausted | Default limit terlalu rendah | Naikkan di php.ini | Tinggi |
| Allowed memory size of 256M exhausted | Limit udah dinaikkan tapi belum cukup | Cari kode boros memori + naikkan lagi | Tinggi |
| Allowed memory size of 512M exhausted | Script yang sangat berat atau memory leak | Profiling + optimasi kode | Sangat Tinggi |
| Error muncul hanya di halaman tertentu | Plugin/halaman spesifik bermasalah | Nonaktifkan plugin satu per satu | Sedang |
| Error muncul di cron job saja | Batch processing butuh lebih banyak RAM | ini_set() di awal script cron | Sedang |
| Error muncul saat upload file | File terlalu besar, PHP coba load di memori | Naikkan upload_max_filesize + memory_limit | Tinggi |
| Error muncul setelah update PHP version | PHP baru lebih strict, config lama gak kompatibel | Re-check semua config php.ini | Tinggi |
Nilai Memory Limit yang Direkomendasikan
Bingung mau set berapa? Ini rekomendasi berdasarkan tipe website dan workload:
| Tipe Website/App | Memory Limit Minimum | Rekomendasi | Catatan |
|---|---|---|---|
| Blog WordPress sederhana | 128M | 256M | Cukup untuk theme ringan + 5-10 plugin |
| WooCommerce toko online | 256M | 512M | Plugin WooCommerce + payment gateway + shipping |
| Laravel/Ci4 application | 128M | 256M-512M | Tergantung kompleksitas query dan queue |
| Image processing | 256M | 512M-1G | GD/Imagick makan banyak untuk resize |
| Import/Export CSV besar | 256M | 512M-2G | Data besar di-memori, pertimbangkan chunking |
| Multisite WordPress | 256M | 512M | Shared memory antar site |
| Shared hosting | 64M-128M | 256M | Tergantung limit provider |

Kenapa Naikkan Memory Limit Saja Gak Cukup
Ini yang mau aku tekankan. Banyak yang langsung lompat ke “naikkan memory limit” tanpa mikir kenapa script-nya makan banyak memori di tempat pertama. Dan ya, itu bikin pusing karena suatu saat kamu akan sampai di batas. Kalau php.ini udah di-set 2G tapi masih error, kamu gak bisa naikkan lagi kecuali upgrade RAM server — yang berarti biaya tambahan. Jadi solusi yang paling sustainable itu: naikkan limit SEBAGAI FIX SEMENTARA, tapi SEKALIGUS cari dan fix kode yang boros memori sebagai fix permanen.
Contoh nyata: kemarin aku handle kasus di mana WooCommerce order export bikin error memory limit. User set memory_limit ke 1G, error masih muncul. Ternyata plugin export-nya load semua order ke array sekaligus — 15.000 order, masing-masing dengan 20+ meta fields. Fix-nya bukan naikkan memory limit lebih tinggi, tapi ganti logic export-nya pakai generator function yang proses 100 order per batch. Hasilnya? Memory usage turun dari 1.2GB ke 64MB. Fix yang bener itu di kode, bukan di config.
Artikel terkait yang mungkin berguna: kalau kamu lagi handle masalah WordPress yang lebih luas, cek juga panduan optimasi WordPress di VPS dan cara cepat fix error 500 di WordPress. Karena sering kali masalah memory limit ini muncul barengan sama error-error lain di WordPress.
FAQ
Q: Apa beda memory_limit di php.ini vs .htaccess vs .user.ini?
Di php.ini itu setting global yang apply ke semua website di server (atau per PHP version). Di .htaccess itu per-directory, cuma berlaku di direktori tempat file .htaccess itu diletakkan dan subdirektorinya, DAN cuma works di Apache dengan mod_php. Di .user.ini itu juga per-directory tapi untuk PHP-FPM/LiteSpeed, dan biasanya di-cache beberapa menit. Prioritasnya: .user.ini/.htaccess > php.ini. Jadi kalau kamu set 512M di .user.ini tapi php.ini cuma 128M, tetap aja 512M yang berlaku — ASAL php.ini gak lock limit-nya. Beberapa server admin sengaja lock limit di php.ini pakai memory_limit = 128M tanpa tanda titik dua (bukan comment), jadi override dari .user.ini gak akan work.
Q: Kenapa error ini muncul padahal saya sudah set memory_limit tinggi?
Beberapa kemungkinan: Pertama, kamu edit file php.ini yang salah. Ada banyak php.ini — cek dengan php --ini untuk tahu yang aktif. Kedua, ada config lain yang override — cek direktori /etc/php/X.Y/fpm/conf.d/ atau /etc/php/X.Y/cli/conf.d/. Ketiga, kalau di shared hosting, provider mungkin udah lock limit di server-side dan gak mengizinkan override. Keempat, kalau WordPress, kamu perlu set juga di wp-config.php — cuma di php.ini belum cukup karena WordPress punya batas internal sendiri. Kelima, kalau pakai PHP-FPM, pastikan kamu restart service-nya setelah edit php.ini. Banyak yang edit tapi lupa restart, terus heran kok gak berubah.
Q: Apakah aman menaikkan memory_limit ke 1G atau lebih?
Aman ASAL kamu tahu kenapa kamu melakukannya dan punya alasan yang jelas. Kalau kamu naikkan ke 1G karena WooCommerce memang butuh, dan server kamu punya RAM 4-8GB, itu wajar. Tapi kalau kamu naikkan ke 1G karena malas fix kode yang bocor memori, itu masalah baru. Karena satu PHP process yang makan 1G bisa bikin process lain kehabisan RAM. Hitung dulu: kalau server punya 4GB RAM, dan kamu set memory_limit 1G, berarti maximal 4 concurrent PHP processes yang bisa jalan — dan itu belum termasuk MySQL, OS, dan service lain. Jadi set secara bijak, dan monitor memory usage secara berkala pakai tools seperti htop atau free -m.
Q: Apakah memory leak di PHP itu nyata atau cuma masalah configuration?
Keduanya bisa terjadi. Memory leak di PHP itu nyata meskipun PHP punya garbage collector. Beberapa penyebab: reference antar objects yang gak di-break, closure yang capture variable dari parent scope tanpa perlu, atau penggunaan static variable di function yang di-call berulang kali. Tapi yang paling sering itu bukan leak murni, melainkan script yang memang butuh banyak memori karena cara kerjanya — misalnya load seluruh database ke array. Jadi sebelum curiga leak, cek dulu apakah script-nya memang dirancang untuk handle data sebanyak itu di memori.
Take it seriously ya. PHP memory limit exhausted itu error yang kelihatannya sepele tapi dampaknya bisa besar kalau terjadi di production. Jangan cuma naikkan limit dan bilang “udah fix” — cari tahu kenapa script-nya makan banyak memori, fix dari akarnya, dan monitor supaya gak terulang. Sebelum close ticket, pastiin kamu udah: 1) cek log error, 2) verifikasi memory_limit aktual, 3) tes di staging sebelum apply ke production, 4) monitor memory usage setelah perubahan. Done.