Я использую стек Apache/PHP/MySQL.
Использование в качестве рамки CakePHP.
Время от времени я получаю пустую белую страницу. Я не могу отлаживать его через Cake, поэтому я заглядываю в apache error.log и вот что получаю:
[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)
Что это за ошибка сегментации, как я могу это исправить, я понятия не имею, и было бы замечательно.
UPDATE:
PHP Version 5.3.4, OSX local development
Server version: Apache/2.2.17 (Unix)
CakePhp: 1.3.10
Прикрепите gdb к одному из дочерних процессов httpd и перезагрузите или продолжите работу и дождитесь сбоя, а затем посмотрите на обратную трассировку. Сделайте что-то вроде этого:
$ ps -ef|grep httpd
0 681 1 0 10:38pm ?? 0:00.45 /Applications/MAMP/Library/bin/httpd -k start
501 690 681 0 10:38pm ?? 0:00.02 /Applications/MAMP/Library/bin/httpd -k start
...
Теперь присоедините gdb к одному из дочерних процессов, в этом случае PID 690 (столбцы - UID, PID, PPID,...)
$ sudo gdb
(gdb) attach 690
Attaching to process 690.
Reading symbols for shared libraries . done
Reading symbols for shared libraries ....................... done
0x9568ce29 in accept$NOCANCEL$UNIX2003 ()
(gdb) c
Continuing.
Подождите краш... затем:
(gdb) backtrace
или
(gdb) backtrace full
Должно дать вам некоторое представление о том, что происходит. Если вы отправите отчет об ошибке, вы должны включить обратную трассировку.
Если сбой трудно воспроизвести, может быть хорошей идеей настроить Apache только для использования одного дочернего процесса для обработки запросов. Конфигурация выглядит примерно так:
StartServers 1
MinSpareServers 1
MaxSpareServers 1
dmesg
для pid процесса segfaults.
Ошибка сегрегации - внутренняя ошибка в php (или, что менее вероятно, apache). Зачастую ошибка сегментации вызвана одним из новых и менее проверенных модулей php, таких как imagemagick или subversion.
Попробуйте отключить все несущественные модули (в php.ini
), а затем повторно включите их один за другим до тех пор, пока не произойдет ошибка. Вы также можете обновить php и apache.
Если это не поможет, вы должны сообщить об ошибке php.
mod-geoip
- теперь я использую расширение php geoip-extension
Вы пытались увеличить output_buffering в php.ini?
output_buffering = 4096
и теперь страницы снова работают. Спасибо
output_buffering = 8192
. Большое спасибо!