Używam stosu Apache / PHP / MySQL.
Używanie jako ramy CakePHP.
Od czasu do czasu otrzymuję pustą białą stronę. Nie mogę go zdebugować za pomocą Cake, więc zaglądam do błędu apache.log i oto co otrzymuję:
[Wed Oct 12 15:27:23 2011] [notice] child pid 3580 exit signal Segmentation fault (11)
[Wed Oct 12 15:27:34 2011] [notice] child pid 3581 exit signal Segmentation fault (11)
[Wed Oct 12 15:30:52 2011] [notice] child pid 3549 exit signal Segmentation fault (11)
[Wed Oct 12 16:04:27 2011] [notice] child pid 3579 exit signal Segmentation fault (11)
zend_mm_heap corrupted
[Wed Oct 12 16:26:24 2011] [notice] child pid 3625 exit signal Segmentation fault (11)
[Wed Oct 12 17:57:24 2011] [notice] child pid 3577 exit signal Segmentation fault (11)
[Wed Oct 12 17:58:54 2011] [notice] child pid 3550 exit signal Segmentation fault (11)
[Wed Oct 12 17:59:52 2011] [notice] child pid 3578 exit signal Segmentation fault (11)
[Wed Oct 12 18:01:38 2011] [notice] child pid 3683 exit signal Segmentation fault (11)
[Wed Oct 12 22:20:53 2011] [notice] child pid 3778 exit signal Segmentation fault (11)
[Wed Oct 12 22:29:51 2011] [notice] child pid 3777 exit signal Segmentation fault (11)
[Wed Oct 12 22:33:42 2011] [notice] child pid 3774 exit signal Segmentation fault (11)
Co to jest ten błąd segmentacji i jak go naprawić?
AKTUALIZACJA:
PHP Version 5.3.4, OSX local development
Server version: Apache/2.2.17 (Unix)
CakePhp: 1.3.10
php
apache
cakephp
error-logging
mgPePe
źródło
źródło
Odpowiedzi:
Dołącz gdb do jednego z procesów potomnych httpd i załaduj ponownie lub kontynuuj pracę i poczekaj na awarię, a następnie spójrz na ślad śledzenia. Zrób coś takiego:
...
Teraz dołącz gdb do jednego z procesów potomnych, w tym przypadku PID 690 (kolumny to UID, PID, PPID, ...)
Poczekaj na awarię ... następnie:
Lub
Powinienem dać ci wskazówkę, co się dzieje. Jeśli zgłaszasz błąd, powinieneś dołączyć ślad.
Jeśli awaria jest trudna do odtworzenia, dobrym pomysłem może być skonfigurowanie Apache do używania tylko jednego procesu potomnego do obsługi żądań. Konfiguracja wygląda mniej więcej tak:
źródło
dmesg
pid uszkodzonego procesu.Unable to access task for process-id 70: (os/kern) failure.
set follow-fork-mode child
a następnie dołącz do procesu nadrzędnego (tego, który uruchamia procesy potomne) -> stackoverflow.com/questions/15126925/ ...Błąd segmentacji to wewnętrzny błąd w php (lub, co mniej prawdopodobne, w Apache). Często błąd segmentacji jest spowodowany przez jeden z nowszych i mniej przetestowanych modułów php, takich jak imagemagick lub subversion.
Spróbuj wyłączyć wszystkie nieistotne moduły (in
php.ini
), a następnie włączaj je jeden po drugim, aż wystąpi błąd. Możesz także zaktualizować php i apache.Jeśli to nie pomoże, zgłoś błąd php .
źródło
mod-geoip
- zamiast tego używam teraz rozszerzenia geoip phpmod-geoip
). Czy problem nadal występuje? Następnie wyłącz więcej. Nie widzisz już żadnych segfaultów? Włącz więcej modułów, dopóki tego nie zrobisz. Jeśli masz zdolności techniczne i masz debugger, zobacz doskonałą odpowiedź @Mathias Wadmann. Pamiętaj jednak, że debugger może wprowadzić Cię w błąd - czasami awaria może być w innym module.Czy próbowałeś zwiększyć output_buffering w swoim php.ini?
Co oznacza „zend_mm_heap uszkodzony” ?
źródło
output_buffering = 4096
i teraz strony znów działają. Dziękioutput_buffering = 8192
działa tylko . Wielkie dzięki!output_buffering = 8192
powoduje segfault, który został naprawiony przez ustawienieoutput_buffering = Off
. Jestem bardzo zdezorientowany.