1 minute read

Нету универсального метода узнать, что 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