Không có nghĩa là zend_mm_heap bị hỏng nghĩa là gì


126

Đột nhiên tôi gặp sự cố với ứng dụng của mình mà trước đây tôi chưa từng gặp phải. Tôi đã quyết định kiểm tra nhật ký lỗi của Apache và tôi thấy một thông báo lỗi có nội dung "zend_mm_heap bị hỏng". Điều đó có nghĩa là gì.

HĐH: Fedora Core 8 Apache: 2.2.9 PHP: 5.2.6


2
Tôi đã sử dụng USE_ZEND_ALLOC=0để lấy stacktrace trong nhật ký lỗi và tìm thấy lỗi /usr/sbin/httpd: corrupted double-linked list, tôi phát hiện ra rằng việc bình luận ra công opcache.fast_shutdown=1việc cho tôi.
Spidfire

Vâng, giống nhau ở đây. Ngoài ra, hãy xem thêm một báo cáo khác bên dưới stackoverflow.com/a353212026/35946
lkraav

Tôi đã có điều tương tự khi sử dụng Laravel. Tôi đã tiêm một lớp vào hàm tạo của lớp khác. Lớp tôi đang tiêm, đang tiêm lớp mà nó được tiêm vào, về cơ bản tạo ra một tham chiếu vòng tròn gây ra vấn đề heap.
Thomas

1
Khởi động lại máy chủ Apache để có giải pháp nhanh nhất và tạm thời :)
Leopathu

Câu trả lời:


52

Sau nhiều thử nghiệm và lỗi, tôi thấy rằng nếu tôi tăng output_bufferinggiá trị trong tệp php.ini, lỗi này sẽ biến mất


59
Tăng lên để làm gì? Tại sao thay đổi này sẽ làm cho lỗi này biến mất?
JDS

2
@JDS câu trả lời này giúp giải thích output_buffering là gì và tại sao việc tăng nó có thể giúp stackoverflow.com/a/2832179/704804
andrewtweber

8
@andrewtweber Tôi biết ob là gì, tôi đã tự hỏi về các chi tiết cụ thể bị bỏ qua câu trả lời của thợ rèn, vì tôi có thông báo lỗi tương tự như op. Đối với việc đóng cửa: hóa ra vấn đề của tôi là một cài đặt được định cấu hình sai liên quan đến memcached. Cảm ơn, mặc dù!
JDS

@JDS cài đặt cấu hình sai?
Kyle Cronin

3
@KyleCronin nền tảng dịch vụ của chúng tôi sử dụng Memcache trong sản xuất. Tuy nhiên, một số trường hợp duy nhất - không sản xuất / hộp cát, khách hàng một lần - không sử dụng memcache. Trong trường hợp sau, tôi đã có một cấu hình được sao chép từ sản xuất cho khách hàng một lần và cấu hình memcache chỉ ra URI máy chủ memcache không có sẵn trong môi trường đó. Tôi đã xóa dòng và vô hiệu hóa memcache trong ứng dụng, và vấn đề đã biến mất. Vì vậy, câu chuyện dài ngắn, một vấn đề rất cụ thể gặp phải trong một môi trường cụ thể, có thể không được áp dụng chung. Nhưng, vì bạn đã hỏi ...
JDS

47

Đây không phải là một vấn đề cần thiết có thể giải quyết bằng cách thay đổi tùy chọn cấu hình.

Thay đổi tùy chọn cấu hình đôi khi sẽ có tác động tích cực, nhưng nó có thể dễ dàng làm mọi thứ tồi tệ hơn hoặc không làm gì cả.

Bản chất của lỗi là đây:

#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;
}

Mã ở trên có thể được biên dịch với:

gcc -g -o corrupt corrupt.c

Thực thi mã với valgrind, bạn có thể thấy nhiều lỗi bộ nhớ, đỉnh điểm là lỗi phân đoạn:

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

Nếu bạn không biết, bạn đã nhận ra đó memlà bộ nhớ được phân bổ heap; Heap đề cập đến vùng bộ nhớ có sẵn cho chương trình khi chạy, bởi vì chương trình yêu cầu rõ ràng (với malloc trong trường hợp của chúng tôi).

Nếu bạn chơi xung quanh với mã khủng khiếp, bạn sẽ thấy rằng không phải tất cả các câu lệnh rõ ràng không chính xác đó đều dẫn đến lỗi phân đoạn (lỗi kết thúc nghiêm trọng).

Tôi đã rõ ràng mắc các lỗi đó trong mã ví dụ, nhưng các loại lỗi tương tự xảy ra rất dễ dàng trong môi trường được quản lý bộ nhớ: Ví dụ: nếu một số mã không duy trì số đếm của một biến (hoặc một số ký hiệu khác) theo cách chính xác nếu nó miễn phí quá sớm, một đoạn mã khác có thể đọc từ bộ nhớ đã có sẵn, nếu bằng cách nào đó lưu địa chỉ sai, một đoạn mã khác có thể ghi vào bộ nhớ không hợp lệ, nó có thể được miễn phí hai lần ...

Đây không phải là các vấn đề có thể được gỡ lỗi trong PHP, chúng hoàn toàn đòi hỏi sự chú ý của một nhà phát triển nội bộ.

Quá trình hành động nên là:

  1. Mở báo cáo lỗi trên http://bugs.php.net
    • Nếu bạn có một segfault, hãy thử cung cấp một backtrace
    • Bao gồm càng nhiều thông tin cấu hình có vẻ phù hợp, đặc biệt, nếu bạn đang sử dụng opcache bao gồm mức tối ưu hóa.
    • Tiếp tục kiểm tra báo cáo lỗi để cập nhật, có thể yêu cầu thêm thông tin.
  2. Nếu bạn đã tải opcache, hãy tắt tối ưu hóa
    • Tôi không chọn opcache, thật tuyệt, nhưng một số tối ưu hóa của nó đã được biết là gây ra lỗi.
    • Nếu điều đó không hiệu quả, mặc dù mã của bạn có thể chậm hơn, trước tiên hãy thử tải opcache.
    • Nếu bất kỳ điều này thay đổi hoặc khắc phục sự cố, hãy cập nhật báo cáo lỗi bạn đã thực hiện.
  3. Vô hiệu hóa tất cả các phần mở rộng không cần thiết cùng một lúc.
    • Bắt đầu kích hoạt tất cả các tiện ích mở rộng của bạn một cách riêng lẻ, kiểm tra kỹ lưỡng sau mỗi lần thay đổi cấu hình.
    • Nếu bạn tìm thấy phần mở rộng vấn đề, hãy cập nhật báo cáo lỗi của bạn với nhiều thông tin hơn.
  4. Lợi nhuận.

Có thể không có bất kỳ lợi nhuận nào ... Tôi đã nói khi bắt đầu, bạn có thể tìm cách thay đổi các triệu chứng của mình bằng cách làm rối cấu hình, nhưng điều này cực kỳ gây ra và bỏ lỡ, và không giúp ích gì cho lần sau bạn có Cùng một zend_mm_heap corruptedthông điệp, chỉ có rất nhiều tùy chọn cấu hình.

Điều thực sự quan trọng là chúng tôi tạo báo cáo lỗi khi phát hiện thấy lỗi, chúng tôi không thể cho rằng người tiếp theo gặp lỗi sẽ làm điều đó ... nhiều khả năng hơn là không, độ phân giải thực tế không có gì bí ẩn, nếu bạn thực hiện đúng người nhận thức được vấn đề.

USE_ZEND_ALLOC

Nếu bạn đặt USE_ZEND_ALLOC=0trong môi trường, điều này sẽ vô hiệu hóa trình quản lý bộ nhớ của Zend; Trình quản lý bộ nhớ của Zend đảm bảo rằng mỗi yêu cầu có một đống riêng, tất cả bộ nhớ đều miễn phí khi kết thúc yêu cầu và được tối ưu hóa để phân bổ các khối bộ nhớ có kích thước phù hợp cho PHP.

Vô hiệu hóa nó sẽ vô hiệu hóa các tối ưu hóa đó, quan trọng hơn là nó có thể sẽ tạo ra rò rỉ bộ nhớ, vì có rất nhiều mã mở rộng dựa trên Zend MM để giải phóng bộ nhớ cho chúng khi kết thúc yêu cầu (tut, tut).

Nó cũng có thể che giấu các triệu chứng, nhưng đống hệ thống có thể bị hỏng theo cách chính xác giống như đống của Zend.

Nó có vẻ khoan dung hơn hoặc kém khoan dung hơn, nhưng khắc phục nguyên nhân gốc rễ của vấn đề thì không thể .

Khả năng vô hiệu hóa nó, là vì lợi ích của các nhà phát triển nội bộ; Bạn không bao giờ nên triển khai PHP với Zend MM bị vô hiệu hóa.


Vậy vấn đề tiềm ẩn có thể là phiên bản PHP nào bạn đang chạy?
Ishmael

@Ishmael Có, cũng như các phiên bản của tất cả các tiện ích mở rộng, vì cảnh báo có thể phát sinh từ một tiện ích mở rộng.
giám mục

2
Câu trả lời này dường như là câu trả lời tốt nhất cho tôi. Cá nhân tôi đã gặp vấn đề một vài lần và nó luôn liên quan đến một phần mở rộng bị lỗi (trong trường hợp của tôi, thư viện chính tả Enchant). Khác với bản thân php, nó cũng có thể là một môi trường xấu (phiên bản lib không khớp, phụ thuộc sai, v.v.)
Fractalizer

1
Cho đến nay, câu trả lời tốt nhất cho câu hỏi này và cho nhiều câu hỏi tương tự khác
Nikita

Câu trả lời này thực sự mang tính hướng dẫn nhưng tôi tin rằng đây không phải là công việc của một nhà phát triển ứng dụng để gỡ lỗi lõi máy chủ. Quả thực sẽ dễ dàng hơn nếu bạn có một dấu vết ngăn xếp đầy đủ nhưng tiếp theo là gì? Yêu cầu sửa nó theo yêu cầu kéo? Không phải ai cũng là tín đồ hoặc có thể hiểu ngôn ngữ cấp thấp như C. Điều ngược lại cũng đúng. Vì vậy, cuối cùng tôi tin rằng sẽ dễ dàng hơn nhiều vì các nhà phát triển sẽ không mắc lỗi quản lý bộ nhớ ngay từ đầu. Như bạn đề xuất là khá phổ biến với opcache, nhưng không ngạc nhiên khi không phải với tất cả các mô-đun, bởi vì bạn biết một số nhà phát triển biết cách phát triển.
job3dot5

46

Tôi đã gặp lỗi tương tự trong PHP 5.5 và việc tăng bộ đệm đầu ra không giúp được gì. Tôi cũng không chạy APC nên đó không phải là vấn đề. Cuối cùng tôi đã theo dõi nó xuống opcache , tôi chỉ đơn giản là phải vô hiệu hóa nó khỏi cli. Có một thiết lập cụ thể cho việc này:

opcache.enable_cli=0

Sau khi chuyển đổi, lỗi hỏng zend_mm_heap đã biến mất.


Vấn đề và giải pháp tương tự ở đây! Cảm ơn!
Mauricio Sánchez

2
Rất lớn cộng 1 cho bài này. Chúng tôi đã thử tất cả mọi thứ nhưng cuối cùng, chỉ có điều này hoạt động.
Geoffrey Brier

7
Tôi chắc chắn rằng bạn biết rằng cli là phiên bản dòng lệnh của php và nó không liên quan gì đến mô-đun php được sử dụng với máy chủ web apache chẳng hạn và tôi tò mò làm thế nào để vô hiệu hóa opcache với cli? (Tôi giả sử rằng điều này đang xảy ra trên máy chủ web)
BIOHAZARD

@BioHazard, ngoài cli còn có cài đặt chung opcache.enable = 0. Nhưng nó không cần thiết giúp vụ án
Konstantin Ivanov

Đây phải là câu trả lời được chấp nhận cho câu hỏi này. Tăng đầu ra_buffering không phải là câu trả lời, vì điều này có thể có tác dụng phụ tiêu cực đến trang web hoặc ứng dụng của bạn, theo tài liệu trong php.ini.
BlueCola

41

Nếu bạn đang ở trên hộp Linux, hãy thử điều này trên dòng lệnh

export USE_ZEND_ALLOC=0

Điều này đã cứu tôi! Tôi thêm phần này vào trong tệp dịch vụ php-fpm (ghi đè systemd)
fzerorubigd

Điều này đã làm điều đó cho tôi. Hãy nhớ thêm dòng này vào /etc/apache2/envvarsnếu bạn đang chạy nó trên máy chủ Ubuntu với cả apache và php được cài đặt từ ppas (apt). PHP 7.0-RC4 bắt đầu ném lỗi này khi tôi cài đặt nó từ kho lưu trữ của ondrej.
Pedro Cordeiro

Và nó cũng hoạt động trên windows:set USE_ZEND_ALLOC=0
Nabi KAZ

22

Kiểm tra cho unset()s. Hãy chắc chắn rằng bạn không unset()tham chiếu đến $this(hoặc tương đương) trong các hàm hủy và unset()các trong các hàm hủy đó không làm cho số tham chiếu đến cùng một đối tượng giảm xuống 0. Tôi đã thực hiện một số nghiên cứu và thấy rằng điều đó thường gây ra đống tham nhũng.

Có một báo cáo lỗi PHP về lỗi bị hỏng zend_mm_heap . Xem bình luận [2011-08-31 07:49 UTC] f dot ardelian at gmail dot comcho một ví dụ về cách tái tạo nó.

Tôi có cảm giác rằng tất cả các "giải pháp" khác (thay đổi php.ini, biên dịch PHP từ nguồn có ít mô-đun, v.v.) chỉ che giấu vấn đề.


6
Tôi đã gặp vấn đề này với dom html đơn giản và đã thay đổi từ unset, thành $ simplehtmldom-> clear () đã giải quyết vấn đề của tôi, cảm ơn!
alexkb

9

Đối với tôi không có câu trả lời nào trước đó có hiệu quả, cho đến khi tôi thử:

opcache.fast_shutdown=0

Điều đó dường như làm việc cho đến nay.

Tôi đang sử dụng PHP 5.6 với PHP-FPM và Apache proxy_fcgi, nếu điều đó quan trọng ...


1
Có rất nhiều phản hồi "tôi cũng vậy" cho tất cả các kịch bản khác nhau, nhưng điều này có vẻ giống với cấu hình của tôi và sự bùng nổ - sự thay đổi chính xác này dường như đã loại bỏ vấn đề của tôi.
lkraav

6

Trong trường hợp của tôi, nguyên nhân gây ra lỗi này là một trong những mảng đang trở nên rất lớn. Tôi đã đặt tập lệnh của mình để đặt lại mảng trên mỗi lần lặp và điều đó đã giải quyết vấn đề.


Điều này đã làm điều đó cho tôi - cảm ơn! Tôi không nghĩ rằng trình thu gom rác sẽ giải phóng bộ nhớ của tài liệu tham khảo theo chu kỳ, vì vậy tôi đã không kiểm tra nó.
nửa nhanh

5

Theo trình theo dõi lỗi, thiết lập opcache.fast_shutdown=0. Tắt máy nhanh sử dụng trình quản lý bộ nhớ Zend để dọn dẹp mớ hỗn độn của nó, điều này vô hiệu hóa điều đó.


Điều này đã cố định "zend_mm_heap bị hỏng" trên phiên bản CentOS Linux 7.2.1511, PHP 5.5,38 của chúng tôi. Bây giờ chúng tôi có thể tiếp tục sử dụng bộ đệm opcode. Đêm và ngày không có nó.
Richard Ginsberg

Cảm ơn đã nhắc nhở, đây chính xác là vấn đề của tôi!
Weasler

4

Tôi không nghĩ có một câu trả lời ở đây, vì vậy tôi sẽ thêm kinh nghiệm của mình. Tôi đã thấy lỗi tương tự này cùng với segfaults httpd ngẫu nhiên. Đây là một máy chủ cPanel. Triệu chứng trong câu hỏi là apache sẽ đặt lại ngẫu nhiên kết nối (Không có dữ liệu nào nhận được trong chrome hoặc kết nối được đặt lại trong firefox). Chúng dường như ngẫu nhiên - hầu hết thời gian nó hoạt động, đôi khi không.

Khi tôi đến, bộ đệm đầu ra cảnh bị TẮT. Bằng cách đọc chủ đề này, gợi ý về bộ đệm đầu ra, tôi bật nó (= 4096) để xem điều gì sẽ xảy ra. Tại thời điểm này, tất cả họ bắt đầu hiển thị các lỗi. Điều này là tốt mà lỗi bây giờ có thể lặp lại.

Tôi đã đi qua và bắt đầu vô hiệu hóa các phần mở rộng. Trong số đó, eaccellerator, pdo, ioncube loader, và rất nhiều thứ trông có vẻ nghi ngờ, nhưng không có gì giúp được.

Cuối cùng tôi đã tìm thấy phần mở rộng PHP nghịch ngợm là "homeloader.so", dường như là một loại mô-đun dễ cài đặt cPanel. Sau khi loại bỏ, tôi không gặp phải bất kỳ vấn đề nào khác.

Trên lưu ý đó, có vẻ như đây là một thông báo lỗi chung vì vậy số dặm của bạn sẽ thay đổi theo tất cả các câu trả lời này, cách hành động tốt nhất bạn có thể thực hiện:

  • Làm cho lỗi lặp lại (điều kiện gì?) Mỗi ​​lần
  • Tìm yếu tố chung
  • Chọn lọc vô hiệu hóa bất kỳ mô-đun, tùy chọn PHP nào, v.v.
  • Nếu điều này không có ích, nhiều câu trả lời trong số này gợi ý rằng nó có thể được giải mã. Một lần nữa, điều quan trọng là làm cho lỗi lặp lại mỗi yêu cầu để bạn có thể thu hẹp nó. Nếu bạn nghi ngờ một đoạn mã đang làm điều này, một lần nữa, sau khi lỗi được lặp lại, chỉ cần xóa mã cho đến khi lỗi dừng lại. Khi nó dừng lại, bạn biết đoạn mã cuối cùng bạn đã xóa là thủ phạm.

Không thực hiện được tất cả những điều trên, bạn cũng có thể thử những thứ như:

  • Nâng cấp hoặc biên dịch lại PHP. Hy vọng bất cứ lỗi nào gây ra vấn đề của bạn được khắc phục.
  • Di chuyển mã của bạn đến một môi trường (thử nghiệm) khác. Nếu điều này khắc phục vấn đề, điều gì đã thay đổi? Tùy chọn php.ini? Phiên bản PHP? Vân vân...

Chúc may mắn.


3

Tôi vật lộn với vấn đề này, trong một tuần, Điều này làm việc cho tôi, hoặc ít nhất vì vậy có vẻ như

Thực php.inihiện những thay đổi này

report_memleaks = Off  
report_zend_debug = 0  

Thiết lập của tôi là

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

Điều này đã không làm việc.

Vì vậy, tôi đã thử sử dụng một tập lệnh chuẩn và thử ghi lại nơi tập lệnh bị treo. Tôi phát hiện ra rằng ngay trước khi xảy ra lỗi, một đối tượng php đã được khởi tạo và phải mất hơn 3 giây để hoàn thành những gì đối tượng phải làm, trong khi trong các vòng lặp trước đó, nó mất tối đa 0,4 giây. Tôi đã chạy thử nghiệm này khá nhiều lần, và lần nào cũng vậy. Tôi nghĩ thay vì tạo một đối tượng mới mỗi lần, (có một vòng lặp dài ở đây), tôi nên sử dụng lại đối tượng. Tôi đã thử nghiệm kịch bản hơn một chục lần cho đến nay và các lỗi bộ nhớ đã biến mất!


1
Điều này làm việc trong một thời gian, nhưng lỗi đã trở lại. Làm thế nào để tôi dừng điều này?
sam

Điều này cũng làm việc với tôi trên mac mavericks với MAMP PRO 2.1.1.
MutantMahesh

Giải pháp này đã không khắc phục vấn đề vĩnh viễn tôi bắt đầu gặp lỗi này một lần nữa.
MutantMahesh

7
Chắc chắn đây chỉ là tắt báo cáo lỗi chứ không phải sửa lỗi?
Robert Went

2

Tìm kiếm bất kỳ mô-đun nào sử dụng bộ đệm và vô hiệu hóa nó.

Tôi đang chạy PHP 5.3.5 trên CentOS 4.8 và sau khi thực hiện điều này, tôi thấy eaccelerator cần nâng cấp.


2

Tôi cũng gặp vấn đề này trên một máy chủ mà tôi sở hữu và nguyên nhân sâu xa là APC. Tôi đã nhận xét phần mở rộng "apc.so" trong tệp php.ini, đã tải lại Apache và các trang web đã được sao lưu ngay.


2

Tôi đã thử mọi thứ ở trên và zend.enable_gc = 0- cài đặt cấu hình duy nhất, đã giúp tôi.

PHP 5.3.10-1ubfox3.2 với Suhosin-Patch (cli) (được xây dựng: ngày 13 tháng 6 năm 2012 17:19:58)


2

Tôi gặp lỗi này khi sử dụng trình điều khiển Mongo 2.2 cho PHP:

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

^^ KHÔNG LÀM VIỆC

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

^^ CÔNG TRÌNH! (?!)


Câu trả lời này đã giúp tôi gỡ lỗi, đi trên con đường vấn đề Mongo. Trong trường hợp của tôi, trình điều khiển PHP 5.6 + Mongo 1.6.9, thông báo bị hỏng zend_mm_heap đã bị ném khi lặp và truy vấn các giá trị từ một mảng được điền trước đóforeach(selectCollection()->find()) { $arr = .. }
Mihai MATEI

2

Trên PHP 5.3, sau nhiều lần tìm kiếm, đây là giải pháp hiệu quả với tôi:

Tôi đã vô hiệu hóa bộ sưu tập rác PHP cho trang này bằng cách thêm:

<? gc_disable(); ?>

đến cuối trang có vấn đề, điều đó làm cho tất cả các lỗi biến mất.

nguồn .


2

Tôi nghĩ rằng rất nhiều lý do có thể gây ra vấn đề này. Và trong trường hợp của tôi, tôi đặt tên cho 2 lớp cùng tên và một lớp sẽ cố gắng tải lớp khác.

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

Và nó gây ra vấn đề này trong trường hợp của tôi.

(Sử dụng khung laravel, chạy php artisan db: seed in real)


1

Tôi gặp vấn đề tương tự và khi tôi có một IP không chính xác cho session.save_path cho các phiên memcached. Thay đổi nó thành IP chính xác đã khắc phục vấn đề.


1

Nếu bạn đang sử dụng các đặc điểm và tính trạng được tải sau lớp (ví dụ: trường hợp tự động tải), bạn cần tải đặc điểm đó trước.

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

Lưu ý: lỗi này là rất rất ngẫu nhiên; do bản chất của nó.


1

Đối với tôi, vấn đề là sử dụng pdo_mysql. Truy vấn trả về kết quả 1960. Tôi đã cố gắng trả lại 1900 hồ sơ và nó hoạt động. Vì vậy, vấn đề là pdo_mysql và mảng quá lớn. Tôi viết lại truy vấn với phần mở rộng mysql gốc và nó đã hoạt động.

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

Apache đã không báo cáo bất kỳ lỗi nào trước đó.

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 bị hỏng" có nghĩa là sự cố với quản lý bộ nhớ. Có thể được gây ra bởi bất kỳ mô-đun PHP. Trong trường hợp của tôi cài đặt APC làm việc ra. Về lý thuyết, các gói khác như eAccelerator, XDebug, vv cũng có thể giúp ích. Hoặc, nếu bạn đã cài đặt loại mô-đun đó, hãy thử tắt chúng đi.


1

Tôi đang viết một phần mở rộng php và cũng gặp phải vấn đề này. Khi tôi gọi một hàm extern với các tham số phức tạp từ tiện ích mở rộng của mình, lỗi này bật lên.

Lý do là tôi không cấp phát bộ nhớ cho một tham số (char *) trong hàm extern. Nếu bạn đang viết cùng một loại tiện ích mở rộng, hãy chú ý đến điều này.


0

Đối với tôi, chính ZendDebugger đã gây ra rò rỉ bộ nhớ và khiến cho MemoryManager bị sập.

Tôi đã tắt nó và tôi hiện đang tìm kiếm một phiên bản mới hơn. Nếu tôi không thể tìm thấy, tôi sẽ chuyển sang xdebug ...


0

Bởi vì tôi không bao giờ tìm thấy giải pháp cho vấn đề này nên tôi quyết định nâng cấp môi trường LAMP của mình. Tôi đã đi đến Ubuntu 10,4 LTS với PHP 5.3.x. Điều này dường như đã ngăn chặn vấn đề đối với tôi.


0

Trong trường hợp của tôi, tôi quên sau đây trong mã:

);

Tôi đã chơi xung quanh và quên nó trong mã ở đây và ở đó - ở một số nơi tôi bị heap tham nhũng, một số trường hợp chỉ là lỗi seg ol 'seg:

[Thứ tư ngày 08 tháng 6 17:23:21 2011] [thông báo] con pid 5720 tín hiệu thoát Lỗi phân đoạn (11)

Tôi đang dùng mac 10.6.7 và xampp.


0

Tôi cũng đã nhận thấy lỗi này và SIGSEGV khi chạy mã cũ sử dụng '&' để ép buộc các tham chiếu trong khi chạy nó trong PHP 5.2+.


0

Cài đặt

assert.active = 0 

trong php.ini đã giúp tôi (nó tắt các xác nhận kiểu trong php5UTF8thư viện và zend_mm_heap corruptedbiến mất)


0

Đối với tôi, sự cố đã bị lỗi trình nền memcached, vì PHP được cấu hình để lưu trữ thông tin phiên trong memcached. Nó đã ăn 100% cpu và hành động kỳ lạ. Sau khi vấn đề khởi động lại memcached đã biến mất.


0

Vì không có câu trả lời nào khác giải quyết nó, tôi gặp vấn đề này trong php 5.4 khi tôi vô tình chạy một vòng lặp vô hạn.


0

Một số lời khuyên có thể giúp một số

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;
    }
}

sử dụng var_dummp () thực sự không phải là một lỗi, nó được đặt chỉ để gỡ lỗi và sẽ bị xóa trên mã sản xuất. Nhưng địa điểm thực sự nơi zend_mm_heap đã xảy ra là nơi thứ hai.


0

Tôi đã ở trong tình trạng tương tự ở đây, không có gì ở trên giúp tôi và kiểm tra nghiêm túc hơn tôi thấy vấn đề của mình, nó bao gồm thử làm chết (tiêu đề ()) sau khi gửi một số đầu ra vào bộ đệm, người đã làm điều này trong Mã đã quên về tài nguyên CakePHP và không tạo ra một ví dụ "return $ this-> redirect ($ url)".

Cố gắng phát minh lại giếng, đây là vấn đề.

Tôi hy vọng điều này có liên quan giúp đỡ một ai đó!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.