摘要:摘要: 解决PHP不显示错误日志,适用于 Ningx + php-fpm +PHP 以及 Apache +mod/cgi+ PHP 方式加载运行的PHP。
PHP不显示错误日志,适用于Ningx+php-fpm+PHP以及Apache+mod/cgi+PHP方式加载运行的PHP。
表现特征为:web访问显示404(nginx)、配置php.ini、配置php-fpm.conf不记录日志。
本文版本信息:
PHP5.6.34
Nginx1.12
Apache2.1
Nginx+php-fpm
这种方式加载运行的PHP,执行调用逻辑如下。
nginx=>php-fpm=>php
1.nginx日志nginx一般只用于记录网络请求状态日志,没有php相关日志。
大多数情况下用于分析200、500、等状态码的地址。
2018/05/1617:42:33[error]27980#0:*1803open()"/www/wwwroot/example/themes/images/sprite_index.png"failed(2:Nosuchfileordirectory),client:113.90.0.1,server:example.com,request:"GET/themes/images/sprite_index.pngHTTP/1.1",host:"example.com",referrer:"http://example.com/themes/css/color.css"
nginx加载PHP一般情况下,我们采用的是fastcgi_pass方式将请求移交给php-fpm去分发解析处理。
fastcgi_passunix:/tmp/php-cgi-56.sock; #或者 fastcgi_pass127.0.0.1:9000;
关于PHP的日志,我们到php-fpm日志中查看。
2.php-fpmphp-fpm是负责调度和管理php-cgi的管理器,调度nginx和php-cgi之间通讯请求的传话员。在这里就可以和php-cgi直接交互,也可以干涉php的一些初始化参数配置。
配置文件:php-fpm.conf
配置文件一般位于php目录下,编译可通过--enalbe-fpm选项开启,位置如php/etc/php-fpm.conf
;配置php-fpm日志输出地址 error_log=/www/server/php/56/var/log/php-fpm.log ;错误级别可用级别为: ;alert(必须立即处理),error(错误情况),warning(警告情况),notice(一般重要信息),debug(调试信息).默认:notice. log_level=notice ;重定向运行过程中的stdout和stderr到主要的错误日志文件中. ;如果没有设置,stdout和stderr将会根据FastCGI的规则被重定向到/dev/null.默认值:空. catch_workers_output=1 ;php_value,php_admin_value用于配置php.ini里面的项的值,可直接配置具体值 ;php_flag,php_admin_flag用于配置php.ini里面项的开关,可使用on/off,1/0,true/false,yes/no. ;以上四种指令,包含admin字符的指令均不会被php脚本ini_set函数所覆盖,反之可能会被ini_set指令冲洗掉。 php_flag[display_errors]=on php_admin_value[error_log]=/var/log/php56/php_error_admin.log php_admin_flag[log_errors]=on php_admin_value[memory_limit]=32M
自此,也就意味着,php.ini配置可能会被php-fpm覆盖掉,也可能会被具体执行的php脚本覆盖掉。
优先级别由低至高如下,php.ini<php-fpm.conf<*.php
对于一个庞大陌生的项目,nginx返回404,最好的解决办法是,检查php.ini配置项之后,再去使用php-fpmphp_admin*指令指定下。最后通过phpinfo()检查一下,配置项是否设置正常。
php-fpm.log常规日志如下
[16-May-201817:31:18]ERROR:FPMinitializationfailed [16-May-201817:31:30]NOTICE:Finishing... [16-May-201817:31:30]NOTICE:exiting,bye-bye! [16-May-201817:31:31]NOTICE:fpmisrunning,pid27896 [16-May-201817:31:31]NOTICE:readytohandleconnections [16-May-201817:32:12]NOTICE:Finishing... [16-May-201817:32:12]NOTICE:exiting,bye-bye! [16-May-201817:32:13]NOTICE:fpmisrunning,pid28330 [16-May-201817:32:13]NOTICE:readytohandleconnections [16-May-201817:32:38]NOTICE:Terminating... [16-May-201817:32:38]NOTICE:exiting,bye-bye! [16-May-201817:32:49]NOTICE:fpmisrunning,pid28727 [16-May-201817:32:49]NOTICE:readytohandleconnections
3.php.ini
关于php.ini日志,也是和php脚本息息相关的,这里可以列举了如下方式,快速显示和定位错误。
;这个是php5.6默认的配置,脚本中都将不能使用这些函数,如果使用则会抛出Warning级别的一个错误。 ;我们在基础上增加一些关于php错误捕获,错误重定向的一些函数,避免错误被项目重定向到空或者某个未知空间。 ;同样也可以在这里禁止ini_set函数,避免项目使用这个函数将我们的配置文件重写掉。 ;增加的函ini_set,error_reporting,set_error_handler,set_exception_handler,register_shutdown_function ;disable_functions=passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru ;增加后的配置 disable_functions=passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,ini_set,error_reporting,set_error_handler,set_exception_handler,register_shutdown_function ;开启错误级别 error_reporting=E_ALL ;error_reporting=E_ALL|~E_NOTICE ;开启显示错误,开启则将错误直接输出到用户端浏览器(stderr),反之则记录在日志error_log(stdout) ;一般生产环境这项是关闭的,对于调试错误可以暂时开启来显示错误或者定位到错误文件。 ;php脚本运行时也可以通过ini_set函数重写掉这项值,前提是保障在运行正常的代码前加入,但也可能被后面的代码所覆盖。 ;所以还是推荐禁用掉ini_set函数解决根本。 display_errors=On ;设置是否将脚本运行的错误信息记录到服务器错误日志或者error_log之中 log_errors=On ;开启日志长度,默认1024,0为不限制,调试时可扩大长度避免产生大量错误没有记录到。 log_errors_max_len=10240 ;捕获错误 ;track_errors=On track_errors=Off ;日志输出的文件路径 ;该文件一定是可以被web用户可写的,例如当前的php-fpm加载器的用户,可以在php-fpm.conf中查看。 ;如果没有权限也可能会造成日志文件不被创建,不被写入的状况。 error_log=/var/log/php56/php_error.log ;以下两个配置项可以用于手工调试时方便使用。 ;error_prepend_string="--errorstart--"要在错误信息之前输出的自定义内容 ;error_append_string="--errorend--"要在错误信息之后输出的自定义内容
自此,主要涉及php的日志就只有两个,php-fpm.conf和php.ini。
优先推荐通过配置php.ini来设置错误项,之后还不能解决再去考虑通过php-fpm.conf去覆盖错误项(php_admin*),终极方案就是通过禁用捕获错误、重定向的相关错误函数来保证配置不会被项目覆盖,以此来调试解决掉项目的错误。
Apache+PHP
相对于Apache配置的PHP来说,获取错误日志的方式就非常简单。只需要短短两行就可以配置完毕。
1.fcgi_modfcgi配置的apache虚拟主机配置文件
<VirtualHost*:80> ServerName"localhost" ServerAliaswww.localhost.com FcgidInitialEnvPHPRC"/usr/local/php/php56/" FcgidWrapper"/usr/local/php/php56/bin/php-cgi".php DocumentRoot"/mnt/www/default/wwwroot" #以下为错误日志和访问日志。 ErrorLog"/mnt/www/default/log/error.log" CustomLog"/mnt/www/default/log/access.log"common </VirtualHost>
php_module配置的方式也可以通过php_value,php_admin_value配置php.ini里面设置项,fcgi_mod找了很久没有找到相应的配置项。
关于防止项目中重写php.ini,也可通过禁用函数来避免。参考上文禁用函数以及开启日志。
一般情况下,Apache的日志会非常准确的定位出来,记录在你所配置的ErrorLog文件中。
总结
这里简单总结下,很多的陌生项目或者有问题却找不到,而且也没有显示出来的项目调错会很头疼。
对于此类项目中,一般是都重定向了错误的输出方式,据此可以禁用掉相关的函数避免项目使用。
常规的项目可以通过常规配置日志的方式来解决记录日志,如果一切都不正常则可能是日志的权限问题。
最后一个则是,确保每一次修改完配置文件,php-fpm的进程或apache的进程都能够全部结束,再运行。
对此,列出以下检查范围,可供参考。
php.ini位置是否正确,对比phpinfo,避免修改错文件 php.ini配置项错误日志全部开启,可选择禁用函数 php-fpm.conf重写php.ini重要选项配置 php-fpm或者apache进程全部结束后,再启动,之后再去验证测试。 确保配置中的文件目录存在,目录下php执行所属用户拥有可写权限。 最终确认项目是否有缓存,避免业务没有执行到,误以为配置错。
相关文章推荐
虚拟主机的专业参数,分别都是什么意思?2022-09-09
中非域名注册规则是怎样的?注册域名有什么用处? 2022-01-10
HostEase新年活动促销 美国/香港主机全场低至五折2021-12-28
HostGator下载完整备份教程分享2021-12-28
Flink中有界数据与无界数据的示例分析2021-12-28