“ zend_mm_heap เสียหาย” หมายถึงอะไร


127

ทันใดนั้นฉันก็ประสบปัญหากับแอปพลิเคชันที่ฉันไม่เคยมีมาก่อน ฉันตัดสินใจตรวจสอบบันทึกข้อผิดพลาดของ Apache และพบข้อความแสดงข้อผิดพลาดว่า "zend_mm_heap เสียหาย" สิ่งนี้หมายความว่า.

ระบบปฏิบัติการ: Fedora Core 8 Apache: 2.2.9 PHP: 5.2.6


2
ฉันเคยUSE_ZEND_ALLOC=0ได้รับ stacktrace ในบันทึกข้อผิดพลาดและพบข้อผิดพลาด/usr/sbin/httpd: corrupted double-linked listฉันพบว่าการแสดงความคิดเห็นนั้นopcache.fast_shutdown=1ได้ผลสำหรับฉัน
Spidfire

ใช่เหมือนกันที่นี่ ดูรายงานอื่นเพิ่มเติมด้านล่างstackoverflow.com/a/35212026/35946
lkraav

ฉันมีสิ่งเดียวกันกับการใช้ Laravel ฉันฉีดคลาสลงในคอนสตรัคเตอร์ของคลาสอื่น คลาสที่ฉันกำลังฉีดกำลังฉีดคลาสที่ถูกฉีดเข้าไปโดยพื้นฐานแล้วการสร้างการอ้างอิงแบบวงกลมทำให้เกิดปัญหาฮีป
โทมัส

1
รีสตาร์ทเซิร์ฟเวอร์ Apache เพื่อการแก้ปัญหาที่รวดเร็วและชั่วคราวที่สุด :)
Leopathu

คำตอบ:


52

หลังจากลองผิดลองถูกมากมายฉันพบว่าถ้าฉันเพิ่มoutput_bufferingค่าในไฟล์ php.ini ข้อผิดพลาดนี้จะหายไป


59
เพิ่มเป็นอะไร? เหตุใดการเปลี่ยนแปลงนี้จึงทำให้ข้อผิดพลาดนี้หายไป
JDS

2
@JDS คำตอบนี้ช่วยอธิบายว่า output_buffering คืออะไรและทำไมการเพิ่มจึงสามารถช่วยได้stackoverflow.com/a/2832179/704803
andrewtweber

8
@andrewtweber ฉันรู้ว่า ob คืออะไรฉันสงสัยเกี่ยวกับรายละเอียดเฉพาะที่ไม่อยู่ในคำตอบของ dsmithers เนื่องจากฉันมีข้อความแสดงข้อผิดพลาดเดียวกันกับ op สำหรับการปิด: ปรากฎว่าปัญหาของฉันคือการตั้งค่าที่กำหนดค่าผิดเกี่ยวกับ memcached ขอบคุณมาก!
JDS

@JDS การตั้งค่าที่กำหนดค่าไม่ถูกต้องคืออะไร?
Kyle Cronin

3
@KyleCronin แพลตฟอร์มบริการของเราใช้ Memcache ในการผลิต อย่างไรก็ตามอินสแตนซ์เดี่ยวบางรายการ - ไม่ใช่การผลิต / แซนด์บ็อกซ์ลูกค้าแบบซื้อครั้งเดียวไม่ใช้ memcache ในกรณีหลังนี้ฉันมีการกำหนดค่าที่คัดลอกจากการผลิตไปยังลูกค้าแบบครั้งเดียวและการกำหนดค่า memcache ระบุ URI ของเซิร์ฟเวอร์ memcache ที่ไม่มีในสภาพแวดล้อมนั้น ฉันลบบรรทัดและปิดการใช้งาน memcache ในแอพและปัญหาก็หายไป ดังนั้นเรื่องสั้นขนาดยาวปัญหาเฉพาะที่พบในสภาพแวดล้อมเฉพาะที่อาจใช้ไม่ได้โดยทั่วไป แต่เนื่องจากคุณถาม ...
JDS

47

นี่ไม่ใช่ปัญหาที่จำเป็นต้องแก้ไขได้โดยการเปลี่ยนตัวเลือกการกำหนดค่า

การเปลี่ยนตัวเลือกการกำหนดค่าบางครั้งอาจส่งผลในเชิงบวก แต่ก็สามารถทำให้สิ่งต่างๆแย่ลงหรือไม่ทำอะไรเลย

ลักษณะของข้อผิดพลาดมีดังนี้:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
    void **mem = malloc(sizeof(char)*3);
    void *ptr;

    /* read past end */
    ptr = (char*) mem[5];   

    /* write past end */
    memcpy(mem[5], "whatever", sizeof("whatever"));

    /* free invalid pointer */
    free((void*) mem[3]);

    return 0;
}

สามารถคอมไพล์โค้ดด้านบนด้วย:

gcc -g -o corrupt corrupt.c

การรันโค้ดด้วย valgrind คุณจะเห็นข้อผิดพลาดของหน่วยความจำจำนวนมากซึ่งเป็นข้อผิดพลาดในการแบ่งส่วน:

krakjoe@fiji:/usr/src/php-src$ valgrind ./corrupt
==9749== Memcheck, a memory error detector
==9749== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==9749== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==9749== Command: ./corrupt
==9749== 
==9749== Invalid read of size 8
==9749==    at 0x4005F7: main (an.c:10)
==9749==  Address 0x51fc068 is 24 bytes after a block of size 16 in arena "client"
==9749== 
==9749== Invalid read of size 8
==9749==    at 0x400607: main (an.c:13)
==9749==  Address 0x51fc068 is 24 bytes after a block of size 16 in arena "client"
==9749== 
==9749== Invalid write of size 2
==9749==    at 0x4C2F7E3: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9749==    by 0x40061B: main (an.c:13)
==9749==  Address 0x50 is not stack'd, malloc'd or (recently) free'd
==9749== 
==9749== 
==9749== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==9749==  Access not within mapped region at address 0x50
==9749==    at 0x4C2F7E3: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9749==    by 0x40061B: main (an.c:13)
==9749==  If you believe this happened as a result of a stack
==9749==  overflow in your program's main thread (unlikely but
==9749==  possible), you can try to increase the size of the
==9749==  main thread stack using the --main-stacksize= flag.
==9749==  The main thread stack size used in this run was 8388608.
==9749== 
==9749== HEAP SUMMARY:
==9749==     in use at exit: 3 bytes in 1 blocks
==9749==   total heap usage: 1 allocs, 0 frees, 3 bytes allocated
==9749== 
==9749== LEAK SUMMARY:
==9749==    definitely lost: 0 bytes in 0 blocks
==9749==    indirectly lost: 0 bytes in 0 blocks
==9749==      possibly lost: 0 bytes in 0 blocks
==9749==    still reachable: 3 bytes in 1 blocks
==9749==         suppressed: 0 bytes in 0 blocks
==9749== Rerun with --leak-check=full to see details of leaked memory
==9749== 
==9749== For counts of detected and suppressed errors, rerun with: -v
==9749== ERROR SUMMARY: 4 errors from 3 contexts (suppressed: 0 from 0)
Segmentation fault

หากคุณไม่ทราบแสดงว่าคุณคิดแล้วว่าmemหน่วยความจำที่จัดสรรเป็นฮีป ฮีปหมายถึงพื้นที่ของหน่วยความจำที่พร้อมใช้งานสำหรับโปรแกรมขณะรันไทม์เนื่องจากโปรแกรมร้องขออย่างชัดเจน (กับ malloc ในกรณีของเรา)

หากคุณเล่นกับรหัสที่น่ากลัวคุณจะพบว่าข้อความที่ไม่ถูกต้องที่เห็นได้ชัดทั้งหมดไม่ได้ส่งผลให้เกิดความผิดพลาดในการแบ่งส่วน

ฉันทำข้อผิดพลาดเหล่านั้นอย่างชัดเจนในโค้ดตัวอย่าง แต่ข้อผิดพลาดประเภทเดียวกันนี้เกิดขึ้นได้ง่ายมากในสภาพแวดล้อมที่มีการจัดการหน่วยความจำ: หากโค้ดบางตัวไม่รักษาการอ้างอิงของตัวแปร (หรือสัญลักษณ์อื่น ๆ ) ด้วยวิธีที่ถูกต้องตัวอย่างเช่น ถ้าฟรีมันเร็วเกินไปโค้ดอีกชิ้นอาจอ่านจากหน่วยความจำที่ว่างอยู่แล้วถ้ามันเก็บที่อยู่ผิดรหัสชิ้นอื่นอาจเขียนไปยังหน่วยความจำที่ไม่ถูกต้องมันอาจจะฟรีสองครั้ง ...

สิ่งเหล่านี้ไม่ใช่ปัญหาที่สามารถแก้ไขได้ใน PHP แต่ต้องได้รับความสนใจจากนักพัฒนาภายใน

แนวทางปฏิบัติควรเป็น:

  1. เปิดรายงานข้อบกพร่องบนhttp://bugs.php.net
    • หากคุณมี segfault ให้ลองระบุbacktrace
    • รวมข้อมูลการกำหนดค่าให้มากที่สุดเท่าที่เหมาะสมโดยเฉพาะอย่างยิ่งหากคุณใช้ opcache รวมระดับการเพิ่มประสิทธิภาพ
    • หมั่นตรวจสอบรายงานข้อบกพร่องสำหรับการอัปเดตอาจมีการขอข้อมูลเพิ่มเติม
  2. หากคุณโหลด opcache ไว้ให้ปิดใช้งานการเพิ่มประสิทธิภาพ
    • ฉันไม่ได้เลือก opcache มันเยี่ยมมาก แต่การเพิ่มประสิทธิภาพบางอย่างเป็นที่ทราบกันดีว่าทำให้เกิดข้อผิดพลาด
    • หากไม่ได้ผลแม้ว่าโค้ดของคุณอาจช้าลงให้ลองยกเลิกการโหลด opcache ก่อน
    • หากมีการเปลี่ยนแปลงหรือแก้ไขปัญหาให้อัปเดตรายงานข้อบกพร่องที่คุณทำ
  3. ปิดการใช้งานส่วนขยายที่ไม่จำเป็นทั้งหมดพร้อมกัน
    • เริ่มเปิดใช้งานส่วนขยายทั้งหมดของคุณทีละรายการทดสอบอย่างละเอียดหลังจากเปลี่ยนการกำหนดค่าแต่ละครั้ง
    • หากคุณพบส่วนขยายของปัญหาให้อัปเดตรายงานข้อบกพร่องของคุณพร้อมข้อมูลเพิ่มเติม
  4. กำไร.

อาจไม่มีผลกำไรใด ๆ ... ฉันบอกว่าในตอนเริ่มต้นคุณอาจสามารถหาวิธีเปลี่ยนอาการของคุณได้โดยยุ่งกับการกำหนดค่า แต่นี่เป็นผลกระทบอย่างมากและพลาดและไม่ช่วยในครั้งต่อไปที่คุณมีzend_mm_heap corruptedข้อความเดียวกันมีตัวเลือกการกำหนดค่ามากมายเท่านั้น

เป็นเรื่องสำคัญมากที่เราจะต้องสร้างรายงานข้อบกพร่องเมื่อเราพบข้อบกพร่องเราไม่สามารถสันนิษฐานได้ว่าบุคคลต่อไปที่จะแก้ไขข้อบกพร่องนั้นจะทำเช่นนั้น ... เป็นไปได้มากกว่านั้นการแก้ปัญหาที่แท้จริงจะไม่ลึกลับหากคุณทำ คนที่เหมาะสมตระหนักถึงปัญหา

USE_ZEND_ALLOC

หากคุณตั้งค่าUSE_ZEND_ALLOC=0ในสภาพแวดล้อมสิ่งนี้จะปิดใช้งานตัวจัดการหน่วยความจำของ Zend เอง ตัวจัดการหน่วยความจำของ Zend ช่วยให้มั่นใจได้ว่าแต่ละคำขอมีฮีปเป็นของตัวเองหน่วยความจำทั้งหมดจะว่างเมื่อสิ้นสุดคำขอและได้รับการปรับให้เหมาะสมกับการจัดสรรหน่วยความจำในขนาดที่เหมาะสมสำหรับ PHP

การปิดใช้งานจะปิดใช้งานการเพิ่มประสิทธิภาพเหล่านั้นที่สำคัญกว่านั้นอาจทำให้เกิดการรั่วไหลของหน่วยความจำเนื่องจากมีโค้ดส่วนขยายจำนวนมากที่อาศัย Zend MM เพื่อเพิ่มหน่วยความจำเมื่อสิ้นสุดคำขอ (tut, tut)

นอกจากนี้ยังอาจซ่อนอาการ แต่ฮีปของระบบอาจเสียหายในลักษณะเดียวกับฮีปของ Zend

มันอาจดูเหมือนจะใจกว้างมากขึ้นหรือน้อยใจกว้าง แต่แก้ไขสาเหตุของปัญหาที่เกิดขึ้นมันไม่สามารถ

ความสามารถในการปิดการใช้งานทั้งหมดเป็นไปเพื่อประโยชน์ของนักพัฒนาภายใน คุณไม่ควรปรับใช้ PHP โดยปิด Zend MM


ดังนั้นปัญหาพื้นฐานอาจเป็นเวอร์ชันของ PHP ที่คุณใช้อยู่?
อิชมาเอล

@Ishmael ใช่เช่นเดียวกับเวอร์ชันของส่วนขยายทั้งหมดเนื่องจากคำเตือนอาจเกิดขึ้นจากส่วนขยาย
อธิการ

2
คำตอบนี้ดูเหมือนจะดีที่สุดสำหรับฉัน ฉันประสบปัญหาเป็นการส่วนตัวสองสามครั้งและมันเกี่ยวข้องกับส่วนขยายที่ผิดพลาดเสมอ (ในกรณีของฉันคือไลบรารีการสะกดคำ Enchant) นอกจาก php เองแล้วยังอาจเป็นสภาพแวดล้อมที่ไม่ดี (เวอร์ชัน lib ไม่ตรงกันการอ้างอิงไม่ถูกต้อง ฯลฯ )
Fractalizer

1
ถึงตอนนี้คำตอบที่ดีที่สุดสำหรับคำถามนี้และสำหรับคำถามอื่น ๆ ที่คล้ายกันเช่นกัน
Nikita 웃

คำตอบนี้ให้คำแนะนำอย่างแท้จริง แต่ฉันเชื่อว่าไม่ใช่หน้าที่ของนักพัฒนาแอปพลิเคชันในการดีบักแกนเซิร์ฟเวอร์ แน่นอนว่ามันง่ายกว่าถ้าคุณมีสแต็กแทร็กแบบเต็ม แต่จะมีอะไรต่อ ขอให้แก้ไขตามคำขอดึง? ไม่ใช่ทุกคนที่เก่งกาจหรือสามารถเข้าใจภาษาระดับต่ำเช่น C ตรงกันข้ามก็เป็นจริงเช่นกัน ดังนั้นในที่สุดฉันเชื่อว่ามันจะง่ายกว่ามากคือผู้พัฒนาจะไม่ทำข้อผิดพลาดในการจัดการหน่วยความจำตั้งแต่แรก ซึ่งตามที่คุณแนะนำนั้นเป็นเรื่องปกติสำหรับ opcache แต่ก็ไม่น่าแปลกใจกับโมดูลทั้งหมดเพราะคุณรู้ว่า dev บางคนรู้วิธี dev
job3dot5

46

ฉันได้รับข้อผิดพลาดเดียวกันนี้ภายใต้ PHP 5.5 และการเพิ่มการบัฟเฟอร์เอาต์พุตไม่ได้ช่วยอะไร ฉันไม่ได้ใช้ APC ด้วยนั่นก็ไม่ใช่ปัญหา ในที่สุดฉันก็ติดตามมันลงไปที่opcacheฉันต้องปิดการใช้งานจาก cli มีการตั้งค่าเฉพาะสำหรับสิ่งนี้:

opcache.enable_cli=0

เมื่อเปลี่ยน zend_mm_heap ข้อผิดพลาดที่เสียหายก็หายไป


ปัญหาเดียวกันและวิธีแก้ไขที่นี่! ขอบคุณ!
Mauricio Sánchez

2
บวก 1 มหาศาลสำหรับโพสต์นี้ เราพยายามทุกอย่างแล้ว แต่สุดท้ายก็ใช้ได้ผล
Geoffrey Brier

7
ฉันแน่ใจว่าคุณรู้ว่า cli เป็นเวอร์ชันบรรทัดคำสั่งของ php และไม่มีส่วนเกี่ยวข้องกับโมดูล php ที่ใช้กับเว็บเซิร์ฟเวอร์ apache และฉันอยากรู้ว่าการปิดใช้งาน opcache ด้วย cli ช่วยได้อย่างไร (ฉันสมมติว่าสิ่งนี้เกิดขึ้นบนเว็บเซิร์ฟเวอร์)
BIOHAZARD

@BioHazard นอกเหนือจาก cli มีการตั้งค่าทั่วไป opcache.enable = 0 แต่มันไม่จำเป็นช่วยในกรณีนี้
Konstantin Ivanov

นี่ควรเป็นคำตอบที่ได้รับการยอมรับสำหรับคำถามนี้ การเพิ่ม output_buffering ไม่ใช่คำตอบเนื่องจากอาจส่งผลด้านลบต่อเว็บไซต์หรือแอปพลิเคชันของคุณได้ตามเอกสารใน php.ini
BlueCola

41

หากคุณใช้กล่อง Linux ให้ลองทำตามคำสั่ง

export USE_ZEND_ALLOC=0

สิ่งนี้ช่วยฉันได้! ฉันเพิ่มสิ่งนี้ภายในไฟล์บริการ php-fpm (systemd override)
fzerorubigd

สิ่งนี้ทำเพื่อฉัน อย่าลืมเพิ่มบรรทัดนี้/etc/apache2/envvarsหากคุณกำลังเรียกใช้สิ่งนี้บนเซิร์ฟเวอร์ ubuntu โดยติดตั้งทั้ง apache และ php จาก ppas (apt) PHP 7.0-RC4 เริ่มแสดงข้อผิดพลาดนี้เมื่อฉันติดตั้งจากที่เก็บของ ondrej
Pedro Cordeiro

และยังใช้งานได้บน windows:set USE_ZEND_ALLOC=0
Nabi KAZ

22

ตรวจสอบunset()s. ตรวจสอบให้แน่ใจว่าคุณไม่ได้unset()อ้างอิงถึง$this(หรือสิ่งที่เทียบเท่า) ในตัวทำลายและสิ่งนั้นunset()ในตัวทำลายจะไม่ทำให้จำนวนการอ้างอิงของวัตถุเดียวกันลดลงเป็น 0 ฉันได้ทำการวิจัยและพบว่านั่นคือสิ่งที่มักทำให้เกิดฮีป คอรัปชั่น.

มีรายงานข้อบกพร่องของ PHP เกี่ยวกับข้อผิดพลาดที่เสียหายของ zend_mm_heap ดูความคิดเห็น[2011-08-31 07:49 UTC] f dot ardelian at gmail dot comสำหรับตัวอย่างวิธีการสร้างซ้ำ

ฉันรู้สึกว่า "โซลูชัน" อื่น ๆ ทั้งหมด (เปลี่ยนแปลงphp.iniรวบรวม PHP จากซอร์สที่มีโมดูลน้อยลง ฯลฯ ) เพียงแค่ซ่อนปัญหา


6
ฉันได้รับปัญหานี้ด้วย html dom แบบง่ายและเปลี่ยนจาก unset เป็น $ simplehtmldom-> clear () ซึ่งช่วยแก้ปัญหาของฉันได้ขอบคุณ!
alexkb

9

สำหรับฉันคำตอบก่อนหน้านี้ไม่ได้ผลจนกว่าฉันจะลอง:

opcache.fast_shutdown=0

ดูเหมือนว่าจะใช้งานได้จนถึงขณะนี้

ฉันใช้ PHP 5.6 กับ PHP-FPM และ Apache proxy_fcgi ถ้าเป็นเช่นนั้น ...


1
มีคำตอบ "ฉันด้วย" มากมายสำหรับสถานการณ์ที่แตกต่างกันทั้งหมด แต่ดูเหมือนว่าจะคล้ายกับการกำหนดค่าของฉันมากที่สุดและการเปลี่ยนแปลงนี้ดูเหมือนจะช่วยขจัดปัญหาของฉันได้
lkraav

6

ในกรณีของฉันสาเหตุของข้อผิดพลาดนี้เป็นหนึ่งในอาร์เรย์ที่มีขนาดใหญ่มาก ฉันได้ตั้งค่าสคริปต์ของฉันให้รีเซ็ตอาร์เรย์ทุกครั้งที่ทำซ้ำและนั่นก็เป็นการจัดเรียงปัญหา


สิ่งนี้ทำเพื่อฉัน - ขอบคุณ! ฉันไม่คิดว่าคนเก็บขยะจะปลดปล่อยหน่วยความจำของการอ้างอิงแบบวนซ้ำดังนั้นฉันจึงไม่ได้ตรวจสอบ
ครึ่งเร็ว

5

opcache.fast_shutdown=0เป็นต่อข้อผิดพลาดติดตามชุด การปิดระบบอย่างรวดเร็วใช้ตัวจัดการหน่วยความจำ Zend เพื่อล้างความยุ่งเหยิงซึ่งจะปิดใช้งาน


"zend_mm_heap ที่เสียหาย" ได้รับการแก้ไขใน CentOS Linux รีลีส 7.2.1511, PHP 5.5.38 ตอนนี้เราสามารถดำเนินการต่อโดยใช้ opcode cache กลางคืนและกลางวันไม่มีมัน
Richard Ginsberg

ขอบคุณสำหรับการแจ้งเตือนนี่คือปัญหาของฉัน!
Weasler

4

ฉันไม่คิดว่าจะมีคำตอบเดียวที่นี่ดังนั้นฉันจะเพิ่มประสบการณ์ของฉัน ฉันเห็นข้อผิดพลาดเดียวกันนี้พร้อมกับการสุ่ม httpd segfaults นี่คือเซิร์ฟเวอร์ cPanel อาการที่เป็นปัญหาคือ apache จะรีเซ็ตการเชื่อมต่อแบบสุ่ม (ไม่ได้รับข้อมูลใน chrome หรือการเชื่อมต่อถูกรีเซ็ตใน firefox) สิ่งเหล่านี้ดูเหมือนสุ่ม - เกือบตลอดเวลาที่ใช้งานได้บางครั้งก็ไม่ได้ผล

เมื่อฉันมาถึงการบัฟเฟอร์เอาต์พุตฉากปิดอยู่ เมื่ออ่านหัวข้อนี้ซึ่งบ่งบอกถึงการบัฟเฟอร์เอาต์พุตฉันจึงเปิดใช้งาน (= 4096) เพื่อดูว่าจะเกิดอะไรขึ้น ณ จุดนี้พวกเขาทั้งหมดเริ่มแสดงข้อผิดพลาด นี่เป็นเรื่องดีที่ข้อผิดพลาดนี้สามารถทำซ้ำได้แล้ว

ฉันผ่านและเริ่มปิดการใช้งานส่วนขยาย ในหมู่พวกเขา eaccellerator, pdo, ioncube loader และอีกมากมายที่ดูน่าสงสัย แต่ไม่มีใครช่วย

ในที่สุดฉันก็พบส่วนขยาย PHP ที่ซุกซนเป็น "homeloader.so" ซึ่งดูเหมือนจะเป็นโมดูล cPanel-easy-installer บางประเภท หลังจากนำออกฉันไม่พบปัญหาอื่น ๆ

ในบันทึกนั้นดูเหมือนว่านี่เป็นข้อความแสดงข้อผิดพลาดทั่วไปดังนั้นค่าไมล์ของคุณจะแตกต่างกันไปตามคำตอบเหล่านี้แนวทางปฏิบัติที่ดีที่สุดที่คุณสามารถทำได้:

  • ทำให้ข้อผิดพลาดเกิดซ้ำได้ (เงื่อนไขอะไร?) ทุกครั้ง
  • ค้นหาปัจจัยร่วม
  • เลือกปิดใช้งานโมดูล PHP ตัวเลือกและอื่น ๆ (หรือหากคุณเร่งรีบให้ปิดการใช้งานทั้งหมดเพื่อดูว่าช่วยได้หรือไม่จากนั้นเลือกเปิดใช้งานใหม่จนกว่าจะแตกอีกครั้ง)
  • หากสิ่งนี้ไม่สามารถช่วยได้คำตอบเหล่านี้หลายคำบอกเป็นนัยว่าอาจเกี่ยวข้องกับรหัส อีกครั้งที่สำคัญคือทำให้ข้อผิดพลาดเกิดซ้ำทุกคำขอเพื่อให้คุณสามารถ จำกัด ให้แคบลงได้ หากคุณสงสัยว่ามีโค้ดบางส่วนกำลังทำสิ่งนี้อีกครั้งหลังจากที่เกิดข้อผิดพลาดซ้ำแล้วให้ลบโค้ดออกจนกว่าข้อผิดพลาดจะหยุดลง เมื่อหยุดแล้วคุณจะรู้ว่าโค้ดชิ้นสุดท้ายที่คุณลบออกไปคือตัวการ

หากล้มเหลวทั้งหมดข้างต้นคุณสามารถลองทำสิ่งต่างๆเช่น:

  • การอัพเกรดหรือคอมไพล์ PHP ใหม่ หวังว่าข้อบกพร่องใด ๆ ที่ทำให้เกิดปัญหาของคุณได้รับการแก้ไข
  • ย้ายรหัสของคุณไปยังสภาพแวดล้อม (การทดสอบ) อื่น หากวิธีนี้ช่วยแก้ปัญหาได้มีอะไรเปลี่ยนแปลงบ้าง? php.ini ตัวเลือก? เวอร์ชัน PHP? ฯลฯ ...

โชคดี.


3

ฉันต่อสู้กับปัญหานี้เป็นเวลาหนึ่งสัปดาห์สิ่งนี้ได้ผลสำหรับฉันหรืออย่างน้อยก็ดูเหมือนว่า

ในphp.iniการเปลี่ยนแปลงเหล่านี้

report_memleaks = Off  
report_zend_debug = 0  

การตั้งค่าของฉันคือ

Linux ubuntu 2.6.32-30-generic-pae #59-Ubuntu SMP  
with PHP Version 5.3.2-1ubuntu4.7  

สิ่งนี้ไม่ได้ผล

ดังนั้นฉันจึงลองใช้สคริปต์เปรียบเทียบและลองบันทึกจุดที่สคริปต์วางสาย ฉันค้นพบว่าก่อนเกิดข้อผิดพลาดอ็อบเจ็กต์ php ถูกสร้างอินสแตนซ์และใช้เวลามากกว่า 3 วินาทีในการทำสิ่งที่ควรทำในขณะที่ในลูปก่อนหน้านี้ใช้เวลาสูงสุด 0.4 วินาที ฉันทำการทดสอบนี้ไม่กี่ครั้งและทุกครั้งก็เหมือนเดิม ฉันคิดว่าแทนที่จะสร้างออบเจ็กต์ใหม่ทุกครั้ง (มีลูปยาวอยู่ที่นี่) ฉันควรใช้อ็อบเจกต์ซ้ำ ฉันได้ทดสอบสคริปต์มากกว่าสิบครั้งแล้วและข้อผิดพลาดของหน่วยความจำก็หายไป!


1
การดำเนินการนี้ใช้งานได้ระยะหนึ่ง แต่ข้อผิดพลาดกลับมา ฉันจะหยุดสิ่งนี้ได้อย่างไร
sam

สิ่งนี้ใช้ได้กับฉันบน mac mavericks กับ MAMP PRO 2.1.1
MutantMahesh

วิธีนี้ไม่สามารถแก้ไขปัญหาได้อย่างถาวรฉันเริ่มได้รับข้อผิดพลาดนี้อีกครั้ง
MutantMahesh

7
แน่นอนว่านี่เป็นเพียงการปิดการรายงานข้อผิดพลาดแทนที่จะแก้ไขปัญหา?
Robert Went

2

มองหาโมดูลที่ใช้บัฟเฟอร์และเลือกปิดใช้งาน

ฉันใช้ PHP 5.3.5 บน CentOS 4.8 และหลังจากทำสิ่งนี้ฉันพบว่า eaccelerator จำเป็นต้องอัปเกรด


2

ฉันเพิ่งมีปัญหานี้เช่นกันบนเซิร์ฟเวอร์ที่ฉันเป็นเจ้าของและสาเหตุหลักคือ APC ฉันแสดงความคิดเห็นเกี่ยวกับส่วนขยาย "apc.so" ในไฟล์ php.ini โหลด Apache ใหม่และไซต์ก็สำรองข้อมูลทันที


2

ฉันได้ลองทุกอย่างข้างต้นแล้วzend.enable_gc = 0- การตั้งค่าการกำหนดค่าเดียวที่ช่วยฉันได้

PHP 5.3.10-1ubuntu3.2 พร้อม Suhosin-Patch (cli) (สร้าง: 13 มิ.ย. 2555 17:19:58 น.)


2

ฉันมีข้อผิดพลาดนี้โดยใช้ไดรเวอร์ Mongo 2.2 สำหรับ PHP:

$collection = $db->selectCollection('post');
$collection->ensureIndex(array('someField', 'someOtherField', 'yetAnotherField')); 

^^ ไม่ได้ผล

$collection = $db->selectCollection('post');
$collection->ensureIndex(array('someField', 'someOtherField')); 
$collection->ensureIndex(array('yetAnotherField')); 

^^ ได้ผล! (?!)


คำตอบนี้ช่วยฉันในการแก้ไขข้อบกพร่องโดยดำเนินตามเส้นทางของปัญหา Mongo ในกรณีของฉันไดรเวอร์ PHP 5.6 + Mongo 1.6.9 ข้อความที่เสียหายของ zend_mm_heap ถูกโยนเมื่อทำซ้ำและค้นหาค่าจากอาร์เรย์ที่เติมข้อมูลก่อนหน้านี้foreach(selectCollection()->find()) { $arr = .. }
Mihai MATEI

2

บน PHP 5.3 หลังจากการค้นหาจำนวนมากนี่เป็นวิธีแก้ปัญหาที่เหมาะกับฉัน:

ฉันได้ปิดใช้งานการรวบรวมขยะ PHPสำหรับหน้านี้โดยเพิ่ม:

<? gc_disable(); ?>

ไปยังจุดสิ้นสุดของหน้าที่มีปัญหาซึ่งทำให้ข้อผิดพลาดทั้งหมดหายไป

แหล่ง


2

ฉันคิดว่าหลายเหตุผลอาจทำให้เกิดปัญหานี้ และในกรณีของฉันฉันตั้งชื่อคลาส 2 คลาสด้วยชื่อเดียวกันและอีกอันจะพยายามโหลดคลาสอื่น

class A {} // in file a.php
class A // in file b.php
{
  public function foo() { // load a.php }
}

และมันทำให้เกิดปัญหานี้ในกรณีของฉัน

(ใช้ laravel framework เรียกใช้ php artisan db: seed ในแบบจริง)


1

ฉันมีปัญหาเดียวกันนี้และเมื่อฉันมี IP ที่ไม่ถูกต้องสำหรับ session.save_path สำหรับเซสชัน memcached การเปลี่ยนเป็น IP ที่ถูกต้องช่วยแก้ปัญหาได้


1

หากคุณใช้ลักษณะและลักษณะถูกโหลดหลังจากคลาส (เช่นกรณีของการโหลดอัตโนมัติ) คุณต้องโหลดลักษณะก่อน

https://bugs.php.net/bug.php?id=62339

หมายเหตุ: ข้อผิดพลาดนี้เป็นแบบสุ่มมาก เนื่องจากเป็นธรรมชาติ


1

สำหรับฉันปัญหาคือการใช้ pdo_mysql การค้นหาส่งคืนผลลัพธ์ 1960 ฉันพยายามส่งคืนระเบียน 1900 และใช้งานได้ ดังนั้นปัญหาคือ pdo_mysql และอาร์เรย์ใหญ่เกินไป ฉันเขียนข้อความค้นหาใหม่ด้วยนามสกุล mysql ดั้งเดิมและใช้งานได้

$link = mysql_connect('localhost', 'user', 'xxxx') or die(mysql_error());
mysql_select_db("db", $link);

Apache ไม่ได้รายงานข้อผิดพลาดใด ๆ ก่อนหน้านี้

zend_mm_heap corrupted
zend_mm_heap corrupted
zend_mm_heap corrupted
[Mon Jul 30 09:23:49 2012] [notice] child pid 8662 exit signal Segmentation fault (11)
[Mon Jul 30 09:23:50 2012] [notice] child pid 8663 exit signal Segmentation fault (11)
[Mon Jul 30 09:23:54 2012] [notice] child pid 8666 exit signal Segmentation fault (11)
[Mon Jul 30 09:23:55 2012] [notice] child pid 8670 exit signal Segmentation fault (11)

1

"zend_mm_heap เสียหาย" หมายถึงปัญหาเกี่ยวกับการจัดการหน่วยความจำ อาจเกิดจากโมดูล PHP ใดก็ได้ ในกรณีของฉันการติดตั้ง APC ได้ผล ในทางทฤษฎีแพ็คเกจอื่น ๆ เช่น eAccelerator, XDebug เป็นต้นอาจช่วยได้เช่นกัน หรือหากคุณติดตั้งโมดูลประเภทนั้นไว้ให้ลองปิดโมดูลเหล่านี้


1

ฉันกำลังเขียนนามสกุล php และพบปัญหานี้ด้วย เมื่อฉันเรียกใช้ฟังก์ชันภายนอกที่มีพารามิเตอร์ที่ซับซ้อนจากส่วนขยายของฉันข้อผิดพลาดนี้จะปรากฏขึ้น

เหตุผลคือฉันไม่ได้จัดสรรหน่วยความจำสำหรับพารามิเตอร์ (ถ่าน *) ในฟังก์ชันภายนอก หากคุณกำลังเขียนส่วนขยายประเภทเดียวกันโปรดใส่ใจกับสิ่งนี้


0

สำหรับฉันมันเป็น ZendDebugger ที่ทำให้หน่วยความจำรั่วไหลและทำให้ MemoryManager พัง

ฉันปิดการใช้งานและฉันกำลังค้นหาเวอร์ชันที่ใหม่กว่า ถ้าหาไม่เจอผมจะเปลี่ยนไปใช้ xdebug ...


0

เพราะฉันไม่เคยพบวิธีแก้ปัญหานี้ฉันจึงตัดสินใจอัพเกรดสภาพแวดล้อม LAMP ของฉัน ฉันไปที่ Ubuntu 10.4 LTS ด้วย PHP 5.3.x. ดูเหมือนว่าจะหยุดปัญหาสำหรับฉันได้แล้ว


0

ในกรณีของฉันฉันลืมรหัสต่อไปนี้:

);

ฉันเล่นไปเรื่อย ๆ และลืมมันในรหัสที่นี่และที่นั่น - ในบางแห่งฉันได้รับความเสียหายจากกองบางกรณีก็เป็นเพียงความผิดปกติของ seg:

[พ. 08 มิ.ย. 17:23:21 น. 2554] [ประกาศ] สัญญาณออกของเด็ก pid 5720 ความผิดปกติของการแบ่งส่วน (11)

ฉันใช้ mac 10.6.7 และ xampp


0

ฉันยังสังเกตเห็นข้อผิดพลาดนี้และ SIGSEGV เมื่อเรียกใช้โค้ดเก่าซึ่งใช้ '&' เพื่อบังคับใช้การอ้างอิงอย่างชัดเจนในขณะที่รันใน PHP 5.2+


0

การตั้งค่า

assert.active = 0 

ใน php.ini ช่วยฉันได้ (มันปิดการยืนยันประเภทในphp5UTF8ห้องสมุดและzend_mm_heap corruptedจากไป)


0

สำหรับฉันปัญหาคือ memcached daemon ล้มเหลวเนื่องจาก PHP ได้รับการกำหนดค่าให้เก็บข้อมูลเซสชันใน memcached มันกิน cpu 100% และทำตัวแปลก ๆ หลังจากปัญหาการรีสตาร์ท memcached หายไป


0

เนื่องจากไม่มีคำตอบอื่นใดที่กล่าวถึงฉันจึงมีปัญหานี้ใน php 5.4 เมื่อฉันวิ่งวนรอบที่ไม่มีที่สิ้นสุดโดยบังเอิญ


0

เคล็ดลับบางอย่างที่อาจช่วยได้

fedora 20, php 5.5.18

public function testRead() {
    $ri = new MediaItemReader(self::getMongoColl('Media'));

    foreach ($ri->dataReader(10) as $data) {
       // ...
    }
}

public function dataReader($numOfItems) {
    $cursor = $this->getStorage()->find()->limit($numOfItems);

    // here is the first place where "zend_mm_heap corrupted" error occurred
    // var_dump() inside foreach-loop and generator
    var_dump($cursor); 

    foreach ($cursor as $data) {
        // ...
        // and this is the second place where "zend_mm_heap corrupted" error occurred
        $data['Geo'] = [
            // try to access [0] index that is absent in ['Geo']
            'lon' => $data['Geo'][0],
            'lat' => $data['Geo'][1]
        ];
        // ...
        // Generator is used  !!!
        yield $data;
    }
}

การใช้ var_dummp () จริงๆแล้วไม่ใช่ข้อผิดพลาดมันถูกวางไว้เพื่อการดีบักเท่านั้นและจะถูกลบออกในรหัสการผลิต แต่สถานที่จริงที่ zend_mm_heap เกิดขึ้นคือสถานที่ที่สอง


0

ฉันอยู่ในสถานการณ์เดียวกันที่นี่ไม่มีอะไรข้างต้นช่วยและตรวจสอบอย่างจริงจังมากขึ้นฉันพบปัญหาของฉันมันประกอบด้วย try do die (header ()) หลังจากส่งเอาต์พุตไปยังบัฟเฟอร์คนที่ทำสิ่งนี้ใน Code ลืมทรัพยากร CakePHP และไม่ได้สร้าง simples "return $ this-> redirect ($ url)"

การพยายามประดิษฐ์บ่อน้ำขึ้นมาใหม่นี่คือปัญหา

ฉันหวังว่าสิ่งนี้จะช่วยใครสักคน!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.