GDB backtrace when PHP crashed
Нету универсального метода узнать, что PHP дает сбой, но могут быть признаки. Периодически на PHP проектах сталкиваюсь с ситуацией, когда веб-сайт резко умирает или код работает очень медленно и внезапно получаете сообщение в браузере "Document contains no data"
а в логе PHP-FPM ошибку такого типа "php-fpm[26790]: segfault at 7f9d55b08638 ip 0000556d22a04348 sp 00007ffcaa6e84c0 error 4 in php-fpm[556d22826000+41a000]"
это может означать, что PHP аварийно завершает работу где-то во время выполнения кода.
Ошибка сегментации возникает когда программа пытается получить доступ к блоку памяти, к которому у вас нет доступа или вы приближаетесь к участку памяти, который вам не принадлежит.
Короче говоря, это так же известно как segfault. Существуют различные причины этой ошибки:
- Не правильно сконфигурирован php-fpm.
- Вы пытаетесь записать в ячейку памяти только для чтения.
- Вы пытаетесь получить доступ к освобожденной ячейке памяти.
- Заканчивается свободная память.
- Ошибка в коде.
Если вы получаете подобные ошибки в логе, вам может потребоваться создать некоторые дампы ядра, чтобы понять, что происходит.
Core Dump — это файл, содержащий адресное пространство (память) процесса, когда процесс неожиданно завершается.
Включение Core Dumps для PHP-FPM на CentOS 7
Set the rlimit_core directive in /etc/php-fpm.d/pool.conf and /etc/php-fpm.conf to unlimited:
rlimit_core = unlimited
Set system parameters to generate core dumps:
# Send dumps via a pipe to the systemd-coredump
sysctl kernel.core_pattern='| /usr/lib/systemd/systemd-coredump %p %u %g %s %t %c %e'
# Enable core dumps for processes using setuid().
sysctl fs.suid_dumpable=2
# Do not add PID to core dump file.
sysctl kernel.core_uses_pid=0
Add to /etc/systemd/system.conf file:
DefaultLimitCORE=infinity
Reload systemd configuration:
systemctl daemon-reload
Restart PHP-FPM:
systemctl restart php-fpm
To confirm core dump was generated look for SIGSEGV - core dumped in PHP-FPM error log:
[11-May-2015 15:34:03] WARNING: [pool www] child 2553 exited on signal 11 (SIGSEGV - core dumped) after 6943 521858 seconds from start
To interact with core dump we can use coredumpctl utility:
coredumpctl list
coredumpctl info 123
coredumpctl gdb 123