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.

Mengomentari pertanyaan (7)

Mengubah memory_limit oleh ini_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.

Komentar (8)

ini_set('memory_limit', '-1'); mengabaikan default batas memori PHP.

Komentar (17)

Cara yang benar adalah dengan mengedit php.ini file. Edit memory_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.

Komentar (4)

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 untuk memory_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. Tambahkan php_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".

Komentar (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.

Komentar (6)

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 pernyataan

$old = ini_set('memory_limit', '8192M');

di 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:

$fh = fopen($myfile);
while (!feof($fh)) {
    array_push($file, stripslashes(fgets($fh)));
}
fclose($fh);

Kesalahan fatal poin untuk baris 3 sampai aku mendorong batas memori, yang menghilangkan kesalahan.

Komentar (3)

Aku terus mendapatkan kesalahan ini, bahkan dengan memory_limit terletak di php.ini, dan nilai membaca dengan benar dengan phpinfo().

Dengan mengubah dari ini:

memory_limit=4G

Untuk ini:

memory_limit=4096M

Ini diperbaiki masalah di PHP 7.

Komentar (0)

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:

function exhaustYourBytes()
{
    return exhaustYourBytes();
}
Komentar (0)

Anda dapat memperbaiki hal ini dengan mengubah memory_limit pada fastcgi/fpm:

$vim /etc/php5/fpm/php.ini

Perubahan memori, seperti dari 128 hingga 512, lihat di bawah ini

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

untuk

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 512M
Komentar (0)

Setelah mengaktifkan kedua garis itu mulai bekerja:

; Determines the size of the realpath cache to be used by PHP. This value should
; be increased on systems where PHP opens many files to reflect the quantity of
; the file operations performed.
; http://php.net/realpath-cache-size
realpath_cache_size = 16k

; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
; http://php.net/realpath-cache-ttl
realpath_cache_ttl = 120

Komentar (1)

Situs's root direktori:

ini_set('memory_limit', '1024M');
Komentar (1)

Untuk pengguna Drupal, ini Chris Lane's jawaban:

ini_set('memory_limit', '-1');

tapi kita harus menempatkan itu hanya setelah pembukaan

<?php

tag di index.php file di situs anda's direktori root.

Komentar (0)

Perubahan batas memori di php.ini file dan restart Apache. Setelah restart, jalankan phpinfo(); fungsi dari setiap file PHP untuk memory_limit perubahan konfirmasi.

memory_limit = -1

Batas memori -1 berarti tidak ada memori batas yang ditetapkan. It's sekarang maksimum.

Komentar (0)

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:

ini_set('memory_limit', '128M');

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.

Komentar (2)

Daripada mengubah memory_limit nilai php.ini file, jika ada's sebuah bagian dari kode yang bisa menggunakan banyak memori, anda bisa menghapus memory_limit sebelum bagian itu berjalan, dan kemudian menggantinya setelah.

$limit = ini_get('memory_limit');
ini_set('memory_limit', -1);
// ... do heavy stuff
ini_set('memory_limit', $limit);
Komentar (0)

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:

# free -m
             total       used       free     shared    buffers     cached
Mem:         64457      63791        666          0       1118      18273
-/+ buffers/cache:      44398      20058
Swap:         1021          0       1021

Di sini saya telah meningkat sebagai berikut ini dan kemudian melakukan service httpd restart untuk memperbaiki kecelakaan halaman masalah.

# grep memory_limit /etc/php.ini
memory_limit = 512M
Komentar (0)

PHP 5.3+ memungkinkan anda untuk mengubah batas memori dengan menempatkan .pengguna.ini file public_html folder. Cukup membuat berkas di atas dan ketik baris berikut di dalamnya:

memory_limit = 64M

Beberapa cPanel host hanya menerima metode ini.

Komentar (0)

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.

class Proxy {

    private $actualObject;

    public function doSomething() {

        return $this->actualObjec->doSomething();
    }
}

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.

Komentar (1)

Aku punya kesalahan berikut saat menjalankan pada dataset yang lebih kecil dari yang telah bekerja sebelumnya.

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 byte) C:\workspace\image_management.php on line 173

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.

Komentar (0)

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 LayananKonfigurasi PHP Editor dan memodifikasi memory_limit:

Komentar (0)