2019独角兽企业重金招聘Python工程师标准>>>

PHP不显示错误日志,适用于 Ningx + php-fpm +PHP 以及 Apache +mod/cgi+ PHP 方式加载运行的PHP。

表现特征为:web访问显示404(nginx)、配置php.ini、配置php-fpm.conf 不记录日志。

本文版本信息:

PHP 5.6.34

Nginx 1.12

Apache2.1

Nginx + php-fpm

这种方式加载运行的PHP,执行调用逻辑如下。

nginx => php-fpm => php

1.nginx日志

nginx 一般只用于记录网络请求状态日志,没有php相关日志。

大多数情况下用于分析200、500、等状态码的地址。

2018/05/16 17:42:33 [error] 27980#0: *1803 open() "/www/wwwroot/example/themes/images/sprite_index.png" failed (2: No such file or directory), client: 113.90.0.1, server: example.com, request: "GET /themes/images/sprite_index.png HTTP/1.1", host: "example.com", referrer: "http://example.com/themes/css/color.css"

nginx 加载PHP 一般情况下,我们采用的是 fastcgi_pass 方式将请求移交给 php-fpm 去分发解析处理。

fastcgi_pass  unix:/tmp/php-cgi-56.sock;
# 或者
fastcgi_pass 127.0.0.1:9000;

关于PHP的日志,我们到 php-fpm 日志中查看。

2.php-fpm

php-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-fpm php_admin* 指令指定下。最后通过 phpinfo() 检查一下,配置项是否设置正常。

php-fpm.log 常规日志如下

[16-May-2018 17:31:18] ERROR: FPM initialization failed
[16-May-2018 17:31:30] NOTICE: Finishing ...
[16-May-2018 17:31:30] NOTICE: exiting, bye-bye!
[16-May-2018 17:31:31] NOTICE: fpm is running, pid 27896
[16-May-2018 17:31:31] NOTICE: ready to handle connections
[16-May-2018 17:32:12] NOTICE: Finishing ...
[16-May-2018 17:32:12] NOTICE: exiting, bye-bye!
[16-May-2018 17:32:13] NOTICE: fpm is running, pid 28330
[16-May-2018 17:32:13] NOTICE: ready to handle connections
[16-May-2018 17:32:38] NOTICE: Terminating ...
[16-May-2018 17:32:38] NOTICE: exiting, bye-bye!
[16-May-2018 17:32:49] NOTICE: fpm is running, pid 28727
[16-May-2018 17:32:49] NOTICE: ready to handle connections

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 = "-- error start --" 要在错误信息之前输出的自定义内容
;error_append_string = "-- error end --" 要在错误信息之后输出的自定义内容

自此,主要涉及php的日志就只有两个, php-fpm.conf 和 php.ini 。

优先推荐通过配置php.ini 来设置错误项,之后还不能解决再去考虑通过php-fpm.conf 去覆盖错误项(php_admin*),终极方案就是通过禁用捕获错误、重定向的相关错误函数来保证配置不会被项目覆盖,以此来调试解决掉项目的错误。

Apache + PHP

相对于Apache配置的PHP来说,获取错误日志的方式就非常简单。只需要短短两行就可以配置完毕。

1.fcgi_mod

fcgi 配置的apache虚拟主机配置文件

<VirtualHost *:80>ServerName "localhost"ServerAlias www.localhost.comFcgidInitialEnv PHPRC "/usr/local/php/php56/"FcgidWrapper "/usr/local/php/php56/bin/php-cgi" .phpDocumentRoot "/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的进程都能够全部结束,再运行。

另外也有一些项目代码中 使用 @ 符号进行屏蔽错误,这造成了 日志文件和页面都不会出现错误,这对于

排错工作会加难以进行,这里无助只能推荐你通过正则匹配全局所有使用@的位置,进行调测。

正则:@[A-z0-9\s]+

手工排错,推荐使用  debug_backtrace(); 

对此,列出以下检查范围,可供参考。

  1. php.ini 位置是否正确,对比phpinfo,避免修改错文件
  2. php.ini 配置项错误日志全部开启,可选择禁用函数
  3. php-fpm.conf 重写php.ini重要选项配置
  4. php-fpm 或者 apache进程全部结束后,再启动,之后再去验证测试。
  5. 确保配置中的文件目录存在,目录下php执行所属用户拥有可写权限。
  6. 最终确认项目是否有缓存,避免业务没有执行到,误以为配置错。

(完)

转载于:https://my.oschina.net/u/2366984/blog/1814077

PHP错误日志,解决不显示不记录日志文件等疑难杂症相关推荐

  1. 解决无法显示隐藏的文件的问题

    解决无法显示隐藏的文件的问题,还是要用到注册表找到 HKEY_LOCAL_MACHINE/Software/Microsoft/windows/ CurrentVersion/explorer/Adv ...

  2. django异常日志_【python小随笔】Django+错误日志(配置Django报错文件指定位置)...

    1:  自定义日志文件.py----------几个文件需要创建日志,就需要重新定义几份 #1定义一个日志文件 创建一个操作日志对象logger file_1= logging.FileHandler ...

  3. php 系统日志,PHP中把错误日志保存在系统日志中(Windows系统)

    PHP中把错误日志保存在系统日志中(Windows系统) [将错误记录到系统日志中] 在 php.ini 中将 error_log 设置为: 复制代码 代码如下: error_log = syslog ...

  4. Oracle的常见错误及解决办法

    ORA-12528: TNS:listener: all appropriate instances are blocking new connections ORA-12528问题是因为监听中的服务 ...

  5. PHP项目中,记录错误日志

    一.场景介绍: 环境:LNMP 我们通常是通过nginx的错误日志来分析分错的,也就是我们在各个server中定义的error_log. 比如下面这样,就是将错误日志定义在/etc/nginx/log ...

  6. asp.net打印错误日志

    对于新手来说错误日志起不到什么太大的作用,因为在开发程序时错误几乎已经排除完毕,即使出现错误也是非常好解决的,小编最近遇到了一个问题,查询了一周才解决,就是靠错误日志解决的. 新建一个类(WebLog ...

  7. apache 错误日志

    概要:熟悉apache, php环境  日志的配置 以及 代码中日志相关的方法 一.apache 配置 LogLevel error // 测试中发现调至error 级别 error_report(E ...

  8. uploadify HTTP 302 错误如何解决?

    TP框架uploadify HTTP 302 错误如何解决? 在核心类文件夹里下的Conf/convention.php中 将 VAR_SESSION_ID打开(建议在模块的conf文件中添加配置,如 ...

  9. VS2005+ACCESS WEB程序出错数据访问权限错误的解决方法

    最近使用VS2005+ACCESS写了一个网站管理系统,上传到服务器上后,在删除数据和新增加数据时总是出错,在本地调试又没有问题.经过检查,原来是服务器的数据库文件没有修改权限,修改数据库文件的访问权 ...

最新文章

  1. BST | 1064 完全二叉搜索树
  2. public class UserServiceImpl extends ServiceImpl UserMapper, User implements UserService
  3. ppt结的概念与使用
  4. 信息系统项目管理师-知识、变更、战略管理核心知识点思维脑图
  5. boost::mpl模块实现identity相关的测试程序
  6. 利用Python进行「基金投资组合优化」(一)
  7. 使用Python批量修改PPTX文件中文本框格式
  8. Pandas库DataFrame的简单应用2
  9. 通用数据链接(UDL)的用法
  10. 服务器mysql_本地如何操作服务器的mysql,详细教程
  11. Linux不能识别usbasp,USBasp制作资料及全过程(菜鸟版)
  12. 找不到罗技鼠标键盘的接收器头:重新连接配对“对码”教程
  13. 自动化有道云笔记自动签到+看广告奖励
  14. 增程式电动汽车建模与仿真(一)
  15. 聚类之层次聚类、基于划分的聚类(…
  16. 华为鸿蒙开发者公测报名,华为发布鸿蒙2.0手机开发者测试版!华为老手机可申请公测...
  17. 同济大学计算机系拿奖学分绩点,萌新必看NO.8|关于学分绩点奖学金,你想知道的都在这里...
  18. 错误“a label can only be part of a statement and a declaration is not a statement”解决方法
  19. 22年的梦想《仙剑奇侠传》
  20. JPA 6.JPQL

热门文章

  1. 警方披露Uber撞人案细节,解密Uber自动驾驶系统
  2. 人人都是作曲家:基于深度神经网络的音乐风格迁移
  3. 打工人,从 JMM 透析 volatile 与 synchronized 原理
  4. 干掉 FastJson
  5. 主宰这个世界的10种算法
  6. SpringBoot第十一篇:springboot集成swagger2,构建优雅的Restful API
  7. 张海腾:语音识别实践教程
  8. 机器学习工业复现的 12 个要素!
  9. 为什么博士要挤破头进高校?同一个实验室,硕士们进了大厂拿高薪
  10. 单个Transformer完成信息检索,谷歌用可微搜索索引打败双编码器模型