分类 php-fpm 下的文章

php-fpm开启core dump

转载自:https://kn007.net/topics/php-fpm-how-to-core-dump/
首先一点,需要打开debug参数,如果编译的时候没有打开,需要重新编译,编译时添加参数:

--enable-debug

设置内核core dump出来的存放路径(注意目录要有权限给php写):

echo "/tmp/core.%e.%p.%t" > /proc/sys/kernel/core_pattern

设置core dump出来的文件大小不做限制:

ulimit -c unlimited

关闭core dump只需要将大小限制为0就不会输出了(获得调试信息后设置这个就关闭core dump了)

ulimit -c 0

测试core dump是否开启成功
创建c程序文件

vim a.c
#include <stdio.h>;
int func(int *p)
{
        *p = 0;
}
int main()
{
        func(NULL);
        return 0;
}
gcc -o main a.c#编译
./main#执行,然后就会出现这个文件了

获得core dump文件,用gdb进行调试,比如:

gdb ~/main core.main.5021.iZ23sw4oxfvZ.1477623334

打开php-fpm的slowlog

  1. 编辑 php-fpm 配置文件
    最近在在转移一个discuz站点的时候,打开网站一直处在请求状态,服务器不返回任何东西,也不结束连接,因为是测试服务器,机器的负载也非常低,cpu内存什么的基本上没使用,打开一个只有一句phpinfo函数的页面又是正常的,问题也不知道如何排除,然后打开php-fpm的slowlog来追踪是哪里代码出的问题


修改request_slowlog_timeout,例如:

;10代表达到或者超过10秒的脚本
request_slowlog_timeout=10
;日志路径
slowlog = /tmp/slow.log
  1. 重启 php-fpm 即可

nginx和php-fpm环境记录php错误日志

转载自 http://www.jb51.net/article/49645.htm
nginx与apache不一样,在apache中可以直接指定php的错误日志,那样在php执行中的错误信息就直接输入到php的错误日志中,可以方便查询。
在nginx中事情就变成了这样:nginx只对页面的访问做access记录日志。不会有php的error log 信息。或者记录如下的很模糊的错误信息

2016/10/18 15:12:53 [error] 3232#0: *4688 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 121.121.121.121, server: dz.snsnb.com, request: "GET /admin.php?m=content&c=create_html&a=public_index&pc_hash=46yC97 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "xxx.xxx.xxx", referrer: "http://xxx.xxx.xxx/admin.php?m=admin"

nginx把对php的请求发给php-fpm fastcgi进程来处理,默认的php-fpm只会输出php-fpm的错误信息,在php-fpm的errors log里也看不到php的errorlog。
原因是php-fpm的配置文件php-fpm.conf中默认是关闭worker进程的错误输出,直接把他们重定向到/dev/null,所以我们在nginx的error log 和php-fpm的errorlog都看不到php的错误日志。
所以我们要进行如下的设置就能查看到nginx下php-fpm不记录php错误日志的方法:

1,修改php-fpm.conf中的配置,如果没有请增加:(这一步做完,php的错误记录就会记录在php-fpm的日志中)

[global]
; Note: the default prefix is /usr/local/php/var
error_log = log/php_error_log
[www]
catch_workers_output = yes

2.修改php.ini中配置,没有则增加:(这一步无效,可能是与我的环境有关,不纠结了,第二步就已经可以看错误日志了)

log_errors = On
error_log = "/usr/local/php/var/log/error_log"
error_reporting=E_ALL&~E_NOTICE

3.重启php-fpm

当PHP执行错误时就能看到错误日志在”/usr/local/lnmp/php/var/log/php_error_log”中了
如果出现:

[root@localhost etc]# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm [17-Apr-2014 18:40:52] ERROR: [/usr/local/php/etc/php-fpm.conf:5] unknown entry 'catch_workers_
[17-Apr-2014 18:40:52] ERROR: failed to load configuration file '/usr/local/php/etc/php-fpm.conf'
[17-Apr-2014 18:40:52] ERROR: FPM initialization failed
 failed

那请在第一步的时候,认真将配置写入相对应的组中,不然就出现上面的:

ERROR: [/usr/local/php/etc/php-fpm.conf:5] unknown entry ‘catch_workers_output'

nginx,php-fpm报错

网站报502错误
nginx记录信息如下

2016/10/18 15:12:53 [error] 3232#0: *4688 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 111.111.111.111, server: dz.snsnb.com, request: "GET /admin.php?m=content&c=create_html&a=public_index&pc_hash=46yC97 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "xxx.xxx.xxx", referrer: "http://xxx.xxx.xxx/admin.php?m=admin"

信息很模糊,打开php-fpm的日志,发现如下

[18-Oct-2016 11:43:25] WARNING: [pool www] child 24554 exited on signal 9 (SIGKILL) after 82.916762 seconds from start
[18-Oct-2016 11:43:25] NOTICE: [pool www] child 24614 started

child在还没有执行完毕就被杀掉了,想起来程序里面加了段提高内存的代码,如下

ini_set('memory_limit','1024M');

在重启完php-fpm之后段时间内是可以正常运行的,可能是child处理多个请求会使用过多内存,于是被杀掉了,于是把max_requests设置成1,使child每次处理完一次请求之后就重启

pm.max_requests = 1

ok