php怎么下载安装后设置错误日志_phpini log配置教程【汇总】
技术百科
雪夜
发布时间:2026-01-01
浏览: 次 PHP错误日志需同时启用log_errors=On和设置有效error_log路径,确认CLI与Web环境各自生效的php.ini位置,重启对应服务并关闭display_errors以保障安全。
PHP 安装后默认通常不记录错误日志,error_log 为空或指向 /dev/null,导致线上问题无法排查。必须手动修改 php.ini 并确认生效位置,否则改了也白改。
怎么确认当前生效的 php.ini 文件路径
很多人直接去改 /etc/php/8.1/apache2/php.ini 或 C:\php\php.ini,但 PHP CLI 和 Web(如 Apache/Nginx)可能加载不同配置文件,且重启服务后也不一定生效。
- 运行
php --ini查看 CLI 模式下加载的配置路径 - 在 Web 环境中新建
info.php,内容为 ,访问后搜索Loaded Configuration File行 - 注意:Nginx + PHP-FPM 场景下,要查的是
php-fpm进程加载的php.ini,不是 Nginx 的配置
error_log 和 log_errors 必须同时启用才写日志
log_errors = Off 是默认值,即使设置了 error_log = /var/log/php_errors.log,错误也不会写入——这是最常被忽略的组合开关。
- 确保
log_errors = On - 设置绝对路径的
error_log = /var/log/php_errors.log(Linux)或error_log = C:\php\logs\php_errors.log(Windows) - 目录必须存在,且 PHP 进程用户(如
www-data、nginx或IIS_IUSRS)有写权限 - 避免用
error_log = syslog除非你真在用 rsyslog —— 它不生成可读文件,新手容易误判“没日志”
display_errors 要关掉,尤其在线上环境
display_errors = On 会把错误直接输出到浏览器,暴露路径、变量、数据库结构,属于严重安全隐患。
- 开发环境可临时开:
display_errors = On+error_reporting = E_ALL - 生产环境必须设为:
,只靠
display_errors = Offerror_log记录 - 若用了框架(如 Laravel、ThinkPHP),它们有自己的日志通道,此时
error_log只捕获 PHP 解析级错误(如语法错、内存溢出),业务异常走框架日志
改完 php.ini 后必须重启对应服务
PHP 配置不是热加载。改完不重启,等于没改。
- Apache:执行
sudo systemctl restart apache2(Debian/Ubuntu)或httpd -k restart(CentOS) - PHP-FPM:执行
sudo systemctl restart php8.1-fpm(版本号按实际替换) - CLI 模式无需重启,但需确认你测试时用的是同一 PHP 二进制(
which php) - 验证是否生效:写一段触发 Notice 的代码(如
echo $undefined_var;),然后tail -f /var/log/php_errors.log看是否追加内容
真正卡住人的从来不是“怎么写配置”,而是搞不清哪个 php.ini 在起作用、权限没给对、或者忘了关 display_errors 就以为“日志没出来”。多查一次 phpinfo(),比重装 PHP 更快解决问题。
# 的是
# 自己的
# 这是
# 很多人
# 线上
# 加载
# 用了
# windows
# 重启
# 设为
# linux
# centos
# ubuntu
# debian
# 数据库
# var
# NULL
# php
# php8
# echo
# apache
# nginx
# 你真
# laravel
# thinkphp
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- XSLT怎么生成动态的HTML属性名和标签名
- 为什么本地php环境运行php脚本卡顿_php执行
- c++如何使用std::bind绑定函数参数_c+
- Mac怎么开启“任何来源”_Mac安装未签名应用的
- c# 在高并发下使用反射发射(Reflection
- Mac的“调度中心”与“空间”怎么用_Mac多桌面
- 获取 PHP 文件最后修改时间的正确方法
- c# Task.ConfigureAwait(tr
- 如何在Golang中解压文件_Golang com
- Python解释执行模型_字节码流程说明【指导】
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- 如何在 Go 中判断变量是否为函数类型
- 如何使用Golang读取日志文件_Golang b
- Win11怎么开启剪贴板历史记录_Windows1
- Windows10如何更改计算机工作组_Win10
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- 如何用正则表达式精确匹配“start”到“end”
- Windows如何使用BitLocker To G
- Python包结构设计_大型项目组织解析【指导】
- 如何优化Golang内存分配与GC调度_Golan
- Windows10怎样设置家长控制_Windows
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- Windows10系统服务优化指南_Win10禁用
- Windows驱动无法加载错误解决方法_驱动签名验
- Python函数缓存机制_lru_cache解析【
- Go语言中正确反序列化多个同级XML元素为结构体切
- 如何在 Go 中正确反序列化 XML 多节点数组(
- 怎么将XML数据可视化 D3.js加载XML
- Windows10如何重置此电脑_Windows1
- 如何使用Golang构建简易投票统计功能_Gola
- Win10文件历史记录怎么用 Win10开启自动备
- Win11输入法切换快捷键怎么改_Windows
- c++ try_emplace用法_c++ map
- Win10电脑怎么设置网络名称_Windows10
- Win11怎么更改电脑密码_Windows 11修
- php本地部署支持nodejs吗_php与node
- Win11如何设置系统语言_Win11系统语言切换
- Win11怎么设置开机问候语_自定义Win11锁屏
- 如何用正则与预处理高效拦截带干扰符的恶意域名
- php查询数据怎么导出csv_查询结果转csv文件
- Win11怎么设置单手模式_Win11触控键盘布局
- Windows10无法识别USB设备描述符请求失败
- 如何使用Golang实现微服务状态监控_Golan
- php怎么下载安装后测试是否成功_简单脚本验证方法
- 如何在JavaScript中动态拼接PHP的bas
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- Django 测试数据库表缺失与字段未创建问题的完
- C++ static_cast和dynamic_c
- MySQL 中使用 IF 和 CASE 实现查询字

display_errors = Off
QQ客服