Tiba-tiba saya mengalami masalah dengan aplikasi saya yang belum pernah saya miliki sebelumnya. Saya memutuskan untuk memeriksa log kesalahan Apache, dan saya menemukan pesan kesalahan yang mengatakan "zend_mm_heap rusak". Apa artinya ini.
OS: Fedora Core 8 Apache: 2.2.9 PHP: 5.2.6
php
heap
fedora
php-internals
bkulyk
sumber
sumber
USE_ZEND_ALLOC=0
mendapatkan stacktrace di log kesalahan dan menemukan bug/usr/sbin/httpd: corrupted double-linked list
, saya menemukan bahwa mengomentariopcache.fast_shutdown=1
bekerja untuk saya.Jawaban:
Setelah banyak percobaan dan kesalahan, saya menemukan bahwa jika saya meningkatkan
output_buffering
nilai dalam file php.ini, kesalahan ini hilangsumber
Ini bukan masalah yang perlu dipecahkan dengan mengubah opsi konfigurasi.
Mengubah opsi konfigurasi kadang-kadang akan berdampak positif, tetapi bisa dengan mudah memperburuk keadaan, atau tidak melakukan apa-apa sama sekali.
Sifat kesalahannya adalah ini:
Kode di atas dapat dikompilasi dengan:
Menjalankan kode dengan valgrind Anda dapat melihat banyak kesalahan memori, yang berujung pada kesalahan segmentasi:
Jika Anda tidak tahu, Anda sudah tahu bahwa itu
mem
adalah tumpukan memori yang dialokasikan; Tumpukan mengacu pada wilayah memori yang tersedia untuk program saat runtime, karena program secara eksplisit memintanya (dengan malloc dalam kasus kami).Jika Anda bermain-main dengan kode mengerikan, Anda akan menemukan bahwa tidak semua pernyataan yang jelas salah menghasilkan kesalahan segmentasi (kesalahan penghentian fatal).
Saya secara eksplisit membuat kesalahan dalam kode contoh, tetapi jenis kesalahan yang sama terjadi dengan sangat mudah dalam lingkungan yang dikelola memori: Jika beberapa kode tidak mempertahankan refcount variabel (atau simbol lain) dengan cara yang benar, misalnya jika gratis itu terlalu dini, sepotong kode lain mungkin membaca dari memori yang sudah bebas, jika entah bagaimana menyimpan alamat yang salah, sepotong kode lain mungkin menulis ke memori yang tidak valid, mungkin bebas dua kali ...
Ini bukan masalah yang bisa didebug dalam PHP, mereka benar-benar membutuhkan perhatian pengembang internal.
Tindakan yang harus dilakukan adalah:
Mungkin tidak ada untung ... Saya katakan di awal, Anda mungkin dapat menemukan cara untuk mengubah gejala Anda dengan mengacaukan konfigurasi, tetapi ini sangat memukul dan meleset, dan tidak membantu saat berikutnya Anda memiliki
zend_mm_heap corrupted
pesan yang sama , hanya ada begitu banyak opsi konfigurasi.Sangat penting bagi kami untuk membuat laporan bug ketika kami menemukan bug, kami tidak dapat berasumsi bahwa orang berikutnya yang memukul bug akan melakukannya ... lebih mungkin daripada tidak, resolusi sebenarnya sama sekali tidak misterius, jika Anda membuat orang yang tepat menyadari masalah tersebut.
USE_ZEND_ALLOC
Jika Anda mengatur
USE_ZEND_ALLOC=0
di lingkungan, ini menonaktifkan manajer memori Zend sendiri; Manajer memori Zend memastikan bahwa setiap permintaan memiliki tumpukan itu sendiri, bahwa semua memori dikosongkan pada akhir permintaan, dan dioptimalkan untuk alokasi potongan memori dengan ukuran yang tepat untuk PHP.Menonaktifkan itu akan menonaktifkan optimasi tersebut, yang lebih penting itu kemungkinan akan membuat kebocoran memori, karena ada banyak kode ekstensi yang bergantung pada Zend MM untuk membebaskan memori bagi mereka di akhir permintaan (tut, tut).
Mungkin juga menyembunyikan gejalanya, tetapi tumpukan sistem dapat rusak dengan cara yang persis sama dengan tumpukan Zend.
Mungkin tampaknya lebih toleran atau kurang toleran, tetapi memperbaiki akar penyebab masalah, itu tidak bisa .
Kemampuan untuk menonaktifkannya sama sekali, adalah untuk kepentingan pengembang internal; Anda tidak boleh menggunakan PHP dengan Zend MM dinonaktifkan.
sumber
Saya mendapatkan kesalahan yang sama di bawah PHP 5.5 dan meningkatkan buffering output tidak membantu. Saya juga tidak menjalankan APC jadi bukan itu masalahnya. Saya akhirnya melacaknya ke opcache , saya hanya perlu menonaktifkannya dari cli. Ada pengaturan khusus untuk ini:
Setelah beralih, kesalahan rusak zend_mm_heap hilang.
sumber
Jika Anda berada di kotak Linux, coba ini di baris perintah
sumber
/etc/apache2/envvars
jika Anda menjalankan ini di server ubuntu dengan apache dan php diinstal dari ppas (apt). PHP 7.0-RC4 mulai melempar kesalahan ini ketika saya menginstalnya dari repositori ondrej.set USE_ZEND_ALLOC=0
Periksa
unset()
s. Pastikan Anda tidakunset()
referensi ke$this
(atau yang setara) di destruktor dan yang adaunset()
di destruktor tidak menyebabkan referensi referensi ke objek yang sama turun menjadi 0. Saya sudah melakukan penelitian dan menemukan bahwa itulah yang biasanya menyebabkan tumpukan korupsi.Ada laporan bug PHP tentang kesalahan rusak zend_mm_heap . Lihat komentar
[2011-08-31 07:49 UTC] f dot ardelian at gmail dot com
untuk contoh bagaimana mereproduksinya.Saya merasa bahwa semua "solusi" lainnya (ubah
php.ini
, kompilasi PHP dari sumber dengan modul yang lebih sedikit, dll.) Hanya menyembunyikan masalahnya.sumber
Bagi saya tidak ada jawaban sebelumnya yang berfungsi, sampai saya mencoba:
Itu sepertinya berhasil sejauh ini.
Saya menggunakan PHP 5.6 dengan PHP-FPM dan Apache proxy_fcgi, jika itu penting ...
sumber
Dalam kasus saya, penyebab kesalahan ini adalah salah satu array menjadi sangat besar. Saya telah mengatur skrip saya untuk mengatur ulang array pada setiap iterasi dan itu mengurutkan masalah.
sumber
Sesuai pelacak bug, atur
opcache.fast_shutdown=0
. Shutdown cepat menggunakan manajer memori Zend untuk membersihkan kekacauannya, ini menonaktifkannya.sumber
Saya tidak berpikir ada satu jawaban di sini, jadi saya akan menambahkan pengalaman saya. Saya melihat kesalahan yang sama ini bersama dengan segfault httpd acak. Ini adalah server cPanel. Gejala yang dimaksud adalah apache secara acak akan mengatur ulang koneksi (Tidak ada data yang diterima dalam chrome, atau koneksi diatur ulang di firefox). Ini tampaknya acak - sebagian besar waktu itu berhasil, kadang-kadang tidak.
Ketika saya tiba di tempat output, buffering OFF. Dengan membaca utas ini, yang mengisyaratkan buffering keluaran, saya menyalakannya (= 4096) untuk melihat apa yang akan terjadi. Pada titik ini, mereka semua mulai menunjukkan kesalahan. Ini bagus bahwa kesalahan sekarang dapat diulang.
Saya melakukan dan mulai menonaktifkan ekstensi. Diantaranya, eaccellerator, pdo, loader ioncube, dan banyak yang tampak mencurigakan, tetapi tidak ada yang membantu.
Saya akhirnya menemukan ekstensi PHP nakal sebagai "homeloader.so", yang tampaknya semacam modul cPanel-easy-installer. Setelah dihapus, saya belum mengalami masalah lain.
Pada catatan itu, tampaknya ini adalah pesan kesalahan umum sehingga jarak tempuh Anda akan bervariasi dengan semua jawaban ini, tindakan terbaik yang dapat Anda ambil:
Gagal semua hal di atas, Anda juga dapat mencoba hal-hal seperti:
Semoga berhasil.
sumber
Saya bergulat dengan masalah ini, selama seminggu, Ini bekerja untuk saya, atau setidaknya begitulah tampaknya
Dalam
php.ini
melakukan perubahan iniPengaturan saya adalah
Ini tidak berhasil.
Jadi saya mencoba menggunakan skrip patokan, dan mencoba merekam di mana skrip digantung. Saya menemukan bahwa tepat sebelum kesalahan, objek php dibuat, dan butuh lebih dari 3 detik untuk menyelesaikan apa yang seharusnya dilakukan objek, sedangkan pada loop sebelumnya butuh maks 0,4 detik. Saya menjalankan tes ini beberapa kali, dan setiap kali sama. Saya berpikir alih-alih membuat objek baru setiap kali, (ada loop panjang di sini), saya harus menggunakan kembali objek tersebut. Saya telah menguji skrip lebih dari selusin kali sejauh ini, dan kesalahan memori telah hilang!
sumber
Cari modul apa saja yang menggunakan buffering, dan nonaktifkan secara selektif.
Saya menjalankan PHP 5.3.5 pada CentOS 4.8, dan setelah melakukan ini saya menemukan eaccelerator perlu ditingkatkan.
sumber
Saya baru saja mengalami masalah ini juga di server yang saya miliki, dan akar masalahnya adalah APC. Saya berkomentar ekstensi "apc.so" di file php.ini, memuat ulang Apache, dan situs kembali muncul.
sumber
Saya sudah mencoba semuanya di atas dan
zend.enable_gc = 0
- satu-satunya pengaturan konfigurasi, yang membantu saya.PHP 5.3.10-1ubuntu3.2 dengan Suhosin-Patch (cli) (dibangun: 13 Juni 2012 17:19:58)
sumber
Saya mengalami kesalahan ini menggunakan driver Mongo 2.2 untuk PHP:
^^ TIDAK BEKERJA
^^ BEKERJA! (?!)
sumber
foreach(selectCollection()->find()) { $arr = .. }
Di PHP 5.3, setelah banyak pencarian, ini adalah solusi yang bekerja untuk saya:
Saya telah menonaktifkan pengumpulan sampah PHP untuk halaman ini dengan menambahkan:
ke akhir halaman bermasalah, yang membuat semua kesalahan hilang.
sumber .
sumber
Saya pikir banyak alasan dapat menyebabkan masalah ini. Dan dalam kasus saya, saya memberi nama 2 kelas dengan nama yang sama, dan satu akan mencoba memuat yang lain.
Dan itu menyebabkan masalah ini dalam kasus saya.
(Menggunakan kerangka laravel, menjalankan php artisan db: seed in real)
sumber
Saya memiliki masalah yang sama dan ketika saya memiliki IP yang salah untuk session.save_path untuk sesi memcached. Mengubahnya ke IP yang benar memperbaiki masalah.
sumber
Jika Anda menggunakan sifat dan sifat tersebut dimuat setelah kelas (mis. Kasus autoloading), Anda perlu memuat sifat tersebut terlebih dahulu.
https://bugs.php.net/bug.php?id=62339
Catatan: bug ini sangat sangat acak; karena sifatnya itu.
sumber
Bagi saya masalahnya adalah menggunakan pdo_mysql. Permintaan mengembalikan hasil tahun 1960. Saya mencoba mengembalikan 1900 catatan dan berhasil. Jadi masalahnya adalah pdo_mysql dan array yang terlalu besar. Saya menulis ulang kueri dengan ekstensi mysql asli dan berhasil.
Apache tidak melaporkan kesalahan sebelumnya.
sumber
"zend_mm_heap rusak" berarti masalah dengan manajemen memori. Dapat disebabkan oleh modul PHP apa pun. Dalam kasus saya menginstal APC berhasil. Secara teori, paket lain seperti eAccelerator, XDebug dll. Dapat membantu juga. Atau, jika Anda memiliki modul semacam itu yang diinstal, cobalah mematikannya.
sumber
Saya menulis ekstensi php dan juga menemui masalah ini. Ketika saya memanggil fungsi eksternal dengan parameter rumit dari ekstensi saya, kesalahan ini muncul.
Alasannya adalah saya tidak mengalokasikan memori untuk parameter (char *) dalam fungsi extern. Jika Anda menulis ekstensi yang sama, harap perhatikan ini.
sumber
Bagi saya, itu adalah ZendDebugger yang menyebabkan kebocoran memori dan membuat MemoryManager lumpuh.
Saya menonaktifkannya dan saat ini saya sedang mencari versi yang lebih baru. Jika saya tidak dapat menemukannya, saya akan beralih ke xdebug ...
sumber
Karena saya tidak pernah menemukan solusi untuk ini, saya memutuskan untuk memutakhirkan lingkungan LAMP saya. Saya pergi ke Ubuntu 10.4 LTS dengan PHP 5.3.x. Ini sepertinya telah menghentikan masalah bagi saya.
sumber
Dalam kasus saya, saya lupa mengikuti kode:
Saya bermain-main dan melupakannya dalam kode di sana-sini - di beberapa tempat saya mendapatkan banyak korupsi, beberapa kasus hanya karena kesalahan:
Saya di mac 10.6.7 dan xampp.
sumber
Saya juga melihat kesalahan ini dan SIGSEGV ketika menjalankan kode lama yang menggunakan '&' untuk secara paksa memaksa referensi saat menjalankannya di PHP 5.2+.
sumber
Pengaturan
di php.ini membantu saya (ini mematikan pernyataan jenis di
php5UTF8
perpustakaan danzend_mm_heap corrupted
pergi)sumber
Bagi saya masalahnya crash daemon memcached, karena PHP dikonfigurasi untuk menyimpan informasi sesi dalam memcached. Itu makan 100% cpu dan bertingkah aneh. Setelah memcached restart, masalah telah hilang.
sumber
Karena tidak ada jawaban lain yang menanganinya, saya mengalami masalah ini di php 5.4 ketika saya secara tidak sengaja menjalankan infinite loop.
sumber
Beberapa tips yang mungkin bisa membantu seseorang
fedora 20, php 5.5.18
menggunakan var_dummp () sebenarnya bukan kesalahan, itu ditempatkan hanya untuk debugging dan akan dihapus pada kode produksi. Tapi tempat nyata di mana zend_mm_heap terjadi adalah tempat kedua.
sumber
Saya dalam situasi yang sama di sini, tidak ada yang membantu di atas, dan memeriksa lebih serius saya menemukan masalah saya, itu terdiri dari coba lakukan mati (header ()) setelah mengirim beberapa output ke buffer, orang yang melakukan ini dalam Kode lupa tentang sumber daya CakePHP dan tidak membuat simples "kembalikan $ this-> redirect ($ url)".
Mencoba menemukan kembali sumur, inilah masalahnya.
Saya harap ini berhubungan membantu seseorang!
sumber