最近配置新机器,PHP和nginx都用的比较新的版本,全部配好之后一切正常
唯独发现PHP的error进不到日志中
主要体现为,一个会产生致命错误的PHP程序(例如语法错误、调用未定义函数等)
在通过浏览器访问时所发生的错误,不会记录到nginx或php本身的错误日志中
而对于PHP来讲,在日常的运行中,记录下所有PHP产生的错误(fatal,warning,notice)是很有必要的
在这里先介绍下之前的环境
PHP 5.3.3,nginx 0.8.53,nginx中每个域名的errorlog都是单独的一个文件
在使用中所有PHP的错误都会以下面的形式进到nginx的errorlog

开始刨根问底找原因
0.文件权限
Linux下干活,出啥问题都要先想一下文件权限是不是对的
检查了下,nginx的errorlog可以正常记录404的错误,php的errorlog也可以正常记录CLI模式下php的错误
这条过了
1.nginx,php 安装问题?
全部重新编译安装,仔细看了下,没有任何错误
2.nginx版本(当前:1.1.14)
一开始以为是nginx版本问题,之前使用的是0.8.53
难道在新版本下,nginx无视掉了php通过FastCGI报的错?
安回以前的版本,发现还是一样的情况,这个猜测没戏了
3.PHP版本(当前:5.3.10)
这个是我最不愿意怀疑的,因为编译安装一次PHP,时间远大于nginx…….
最后硬着头皮,编译安装到能正常输出errorlog的机器的PHP版本(5.3.3)
哇,果然好了
3.到底是在PHP的哪次版本变更中开始的?
一不做二不休,把从5.3.3到5.3.10的PHP全安了一遍
果然不出所料,在5.3.8还可以正常报错,在5.3.9中就不正常了
去php.net看changelog,丝毫没有发现对于errorlog的修改
心中起疑,一个这么大的bug,在历经两次版本更新还未被修复?
4.不应该啊…难道是我做错什么了?
灵光一现啊!
突然想到,之前在PHP 5.3.10下,用户访问时PHP出现错误无法记录到PHP的errorlog中,但在CLI模式下却可以
会不会是文件的权限问题呢?
随即把PHP的errorlog权限改成777,果然,用户访问时的错误可以正常记录了
再换回到5.3.3,发现也可以记录到PHP的errorlog中了,但记录到nginx中的却没了
再把nginx新老版本试了一下,结果不变
基本得到了下面的结论:
在PHP 5.3.8及之前的版本中,通过FastCGI运行的PHP,在用户访问时出现错误,会首先写入到PHP的errorlog中
如果PHP的errorlog无法写入,则会将错误内容返回给FastCGI接口,然后nginx在收到FastCGI的错误返回后记录到了nginx的errorlog中
在PHP 5.3.9及之后的版本中,出现错误后PHP只尝试写入PHP的errorlog中,如果失败则不会再返回到FastCGI了
但还有些不解:
1.在PHP的changelog中并未提到对于此处的修改
2.从运行机制上讲,没有必要做出这种修改
由此引发出新的猜测:
1.会不会仅仅是php-fpm的修改(配置文件完全相同)
2.有某参数负责设置该功能,默认值变了
后记:
尝试看了下php的源码,基础有限且对php源码不熟悉,最终没有花更多的时间去研究
待高人解答