Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted (CodeIgniter + XML-RPC)
Saya memiliki banyak klien point of sale (POS) sistem yang secara berkala mengirimkan data penjualan ke satu database terpusat yang menyimpan data ke dalam satu database yang besar untuk pembuatan laporan.
Klien POS didasarkan pada PHPPOS, dan saya telah menerapkan modul yang menggunakan standar XML-RPC perpustakaan untuk mengirimkan data penjualan ke layanan. Sistem server ini dibangun pada CodeIgniter, dan menggunakan XML-RPC dan XML-RPC perpustakaan untuk webservice komponen. Setiap kali saya mengirim banyak data penjualan (sesedikit 50 baris dari tabel penjualan, dan masing-masing baris dari sales_items yang berkaitan dengan masing-masing item dalam penjualan) saya mendapatkan error berikut:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)
128M adalah nilai default di php.ini
, tapi saya menganggap bahwa sejumlah besar untuk istirahat. Pada kenyataannya, saya bahkan telah mencoba menetapkan nilai ini untuk 1024M, dan semua itu tidak akan memakan waktu lebih lama untuk kesalahan.
Adapun langkah-langkah saya'sudah diambil, saya've mencoba menonaktifkan semua pemrosesan di sisi server, dan telah dicurangi itu untuk kembali kaleng respon terlepas dari masukan. Namun, saya percaya masalah sebenarnya terletak pada pengiriman data. I've bahkan mencoba menonaktifkan maksimum eksekusi script waktu PHP, dan itu masih kesalahan.
Mengubah
memory_limit
olehini_set('memory_limit', '-1');
adalah tidak solusi yang tepat. Silakan don't melakukan itu.Kode PHP anda mungkin memiliki kebocoran memori di suatu tempat dan anda memberitahu server untuk hanya menggunakan semua memori yang diinginkannya. Anda tidak't telah tetap masalah sama sekali. Jika anda memantau server anda, anda akan melihat bahwa sekarang mungkin yang paling banyak menggunakan RAM dan bahkan swapping ke disk.
Anda mungkin harus mencoba untuk melacak menyinggung kode dalam kode anda dan memperbaikinya.
ini_set('memory_limit', '-1');
mengabaikan default batas memori PHP.Cara yang benar adalah dengan mengedit
php.ini
file. Editmemory_limit
dengan keinginan anda nilai.Dari pertanyaan anda,
128M
(yang merupakan default limit) telah terlampaui, sehingga ada sesuatu yang serius yang salah dengan kode seperti itu seharusnya tidak mengambil banyak.Jika anda tahu mengapa hal itu membutuhkan waktu yang banyak dan anda ingin untuk memungkinkan mengatur
memory_limit = 512M
atau yang lebih tinggi dan anda harus baik.Alokasi memori untuk PHP dapat disesuaikan secara permanen, atau sementara.
Secara permanen
Anda dapat secara permanen mengubah PHP alokasi memori dua cara.
Jika anda memiliki akses ke
php.ini
file, anda dapat mengedit nilai untukmemory_limit
dengan keinginan anda nilai.Jika anda tidak memiliki akses ke
php.ini
file (dan hosting anda memungkinkan), anda dapat mengganti alokasi memori melalui anda.htaccess
. Tambahkanphp_value memory_limit 128M
(atau apapun yang anda inginkan alokasi).Sementara
Anda dapat mengatur alokasi memori dengan cepat dari dalam file PHP. Anda hanya memiliki kode
ini_set('memory_limit', '128M');
(atau apapun yang anda inginkan alokasi). Anda dapat menghapus batas memori (meskipun mesin atau contoh batas-batas yang mungkin masih berlaku) dengan menetapkan nilai ke "-1".It's sangat mudah untuk mendapatkan kebocoran memori di script PHP - terutama jika anda menggunakan abstraksi, seperti ORM. Cobalah menggunakan Xdebug untuk profil script anda dan mencari tahu di mana semua memori itu pergi.
Ketika menambahkan 22,5 juta catatan ke dalam sebuah array dengan array_push aku terus mendapatkan "memori habis" kesalahan fatal di sekitar 20M catatan menggunakan
4G
sebagai batas memori di file php.ini. Untuk memperbaiki ini, saya menambahkan pernyataandi bagian atas file. Sekarang semuanya bekerja dengan baik. Saya tidak tahu apakah PHP memiliki kebocoran memori. Itu bukan pekerjaan saya, saya juga tidak peduli. Aku hanya harus mendapatkan pekerjaan yang dilakukan, dan ini bekerja.
Program ini sangat sederhana:
Kesalahan fatal poin untuk baris 3 sampai aku mendorong batas memori, yang menghilangkan kesalahan.
Aku terus mendapatkan kesalahan ini, bahkan dengan
memory_limit
terletak diphp.ini
, dan nilai membaca dengan benar denganphpinfo()
.Dengan mengubah dari ini:
Untuk ini:
Ini diperbaiki masalah di PHP 7.
Ketika anda melihat kesalahan di atas - terutama jika
(mencoba untuk mengalokasikan __ bytes)
adalah nilai yang rendah, yang bisa menjadi indikator loop tak terbatas, seperti sebuah fungsi yang memanggil dirinya sendiri dengan tidak ada jalan keluar:Anda dapat memperbaiki hal ini dengan mengubah
memory_limit
pada fastcgi/fpm:Perubahan memori, seperti dari 128 hingga 512, lihat di bawah ini
untuk
Setelah mengaktifkan kedua garis itu mulai bekerja:
Situs's root direktori:
Untuk pengguna Drupal, ini Chris Lane's jawaban:
tapi kita harus menempatkan itu hanya setelah pembukaan
tag di index.php file di situs anda's direktori root.
Perubahan batas memori di php.ini file dan restart Apache. Setelah restart, jalankan phpinfo(); fungsi dari setiap file PHP untuk
memory_limit
perubahan konfirmasi.Batas memori -1 berarti tidak ada memori batas yang ditetapkan. It's sekarang maksimum.
Di Drupal 7, anda dapat memodifikasi batas memori di settings.php file yang terletak di sites/default folder. Di sekitar garis 260, anda'll melihat ini:
Bahkan jika anda php.ini pengaturan yang cukup tinggi, anda tidak't dapat mengkonsumsi lebih dari 128 MB jika ini isn't set di Drupal anda settings.php file.
Daripada mengubah
memory_limit
nilaiphp.ini
file, jika ada's sebuah bagian dari kode yang bisa menggunakan banyak memori, anda bisa menghapusmemory_limit
sebelum bagian itu berjalan, dan kemudian menggantinya setelah.Kecelakaan halaman?
(Itu terjadi ketika MySQL memiliki permintaan yang besar baris. Secara default,
memory_limit
adalah set kecil, yang lebih aman untuk hardware.)Anda dapat memeriksa sistem anda ada status memori, sebelum meningkatkan
php.ini
:Di sini saya telah meningkat sebagai berikut ini dan kemudian melakukan
service httpd restart
untuk memperbaiki kecelakaan halaman masalah.PHP 5.3+ memungkinkan anda untuk mengubah batas memori dengan menempatkan
.pengguna.ini
filepublic_html
folder. Cukup membuat berkas di atas dan ketik baris berikut di dalamnya:Beberapa cPanel host hanya menerima metode ini.
Untuk orang-orang yang menggaruk kepala mereka untuk mencari tahu mengapa di bumi ini sedikit fungsi harus menyebabkan kebocoran memori, kadang-kadang dengan sedikit kesalahan, fungsi dimulai secara rekursif memanggil dirinya untuk selama-lamanya.
Sebagai contoh, proxy kelas yang memiliki nama yang sama untuk suatu fungsi dari objek yang akan proxy itu.
Kadang-kadang anda mungkin lupa untuk membawa sedikit actualObjec anggota dan karena proxy yang benar-benar memiliki
melakukan sesuatu
metode, PHP tidak't memberikan anda setiap kesalahan dan untuk kelas besar, itu bisa tersembunyi dari mata selama beberapa menit untuk mencari tahu mengapa hal ini bocor memori.Aku punya kesalahan berikut saat menjalankan pada dataset yang lebih kecil dari yang telah bekerja sebelumnya.
Seperti mencari kesalahan membawa saya ke sini, saya pikir saya'd menyebutkan bahwa itu's tidak selalu solusi teknis dalam jawaban sebelumnya, tapi sesuatu yang lebih sederhana. Dalam kasus saya itu adalah Firefox. Sebelum aku berlari program itu sudah menggunakan 1,157 MB.
Ternyata saya'a sudah menonton 50 menit video yang sedikit pada suatu waktu selama hari dan mengacaukan segalanya. It's semacam memperbaiki bahwa para ahli yang benar bahkan tanpa berpikir tentang hal itu, tapi untuk orang seperti saya itu's diingat.
Jika anda're menjalankan WHM bertenaga VPS (virtual private server) anda mungkin menemukan bahwa anda tidak memiliki izin untuk mengedit PHP.INI secara langsung; sistem harus melakukannya. Di WHM host control panel, pergi ke Konfigurasi Layanan → Konfigurasi PHP Editor dan memodifikasi
memory_limit
: