
当您的网站显示"500内部服务器错误"、空白屏幕或行为异常时,PHP错误日志是首先要检查的地方。此文件记录代码中发生的每个PHP错误,允许您精确定位问题根源。本指南说明如何在DirectAdmin主机上启用和读取PHP错误日志。
什么是PHP错误日志?
PHP错误日志是一个纯文本文件,其中PHP写入脚本执行期间发生的每个错误的详细信息。错误分为几个严重级别:
- 致命错误 — 立即停止脚本执行的严重错误(例如,调用未定义的函数)
- 警告 — 指示需要修复问题的非致命问题
- 通知 — 表示代码可能需要改进的信息提示
- 解析错误 — 语法错误,如缺少分号或未关闭的括号
- 已弃用 — 计划在未来PHP版本中删除的函数
在DirectAdmin上启用PHP错误日志记录
方法1 — 通过DirectAdmin编辑php.ini
- 转到DirectAdmin → 高级功能 → PHP配置
- 设置这些值:
error_reporting = E_ALL log_errors = On error_log = /home/username/public_html/php_errors.log display_errors = Off
在生产服务器上始终设置 display_errors = Off 以防止错误消息对网站访问者可见。
方法2 — 使用.htaccess
如果您无法直接访问php.ini,请使用.htaccess:
php_flag log_errors on php_value error_log /home/username/public_html/php_errors.log php_flag display_errors off php_value error_reporting 32767
方法3 — WordPress wp-config.php
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
WordPress将自动将错误写入 wp-content/debug.log。
警告:切勿在生产网站上启用 display_errors = On。错误消息可能会向任何浏览您网站的人暴露文件路径、数据库凭据和其他敏感信息。
如何读取PHP错误日志
启用错误日志记录后,可以通过以下几种方式访问日志文件:
通过DirectAdmin文件管理器
- 打开文件管理器
- 找到
php_errors.log或debug.log - 右键单击并选择查看或编辑
通过SSH / Shell
# 查看最后50行 tail -n 50 /home/username/public_html/php_errors.log # 实时跟踪日志 tail -f /home/username/public_html/php_errors.log # 仅搜索致命错误 grep "Fatal error" /home/username/public_html/php_errors.log
解释错误消息
错误消息示例及各部分的含义:
[16-May-2026 10:23:45 UTC] PHP Fatal error: Uncaught Error: Call to undefined function get_header() in /home/user/public_html/wp-content/themes/mytheme/index.php:5
- 时间戳 — 错误发生的时间
- 错误类型 — 致命错误/警告/通知
- 描述 — 调用未定义的函数get_header()
- 文件和行号 — index.php第5行
常见PHP错误和解决方案
- 调用未定义的函数 — 缺少定义该函数的包含文件或插件
- 类未找到 — 自动加载器未加载或命名空间不正确
- 内存耗尽 — 在php.ini或wp-config.php中增加
memory_limit - 超过最大执行时间 — 查询缓慢或无限循环;增加
max_execution_time - 权限被拒绝 — 文件权限不正确;文件应为644,文件夹755
调试的关键php.ini设置
除了错误日志记录外,多个php.ini值会显著影响如何捕获错误以及PHP运行脚本的可用资源。下表显示了开发环境与生产环境的推荐值 — 这两种环境应始终不同。
| php.ini设置 | 开发 | 生产 | 效果 |
|---|---|---|---|
| display_errors | 开启 | 关闭 | 在屏幕上显示或隐藏错误 |
| log_errors | 开启 | 开启 | 将错误写入日志文件 |
| error_reporting | E_ALL | E_ALL & ~E_NOTICE | 要捕获的错误类型 |
| memory_limit | 256M | 128M–256M | 每个脚本的最大RAM |
| max_execution_time | 120 | 60 | 脚本可运行的最大秒数 |
在DirectAdmin上,导航到高级功能 → PHP配置以调整这些值,而无需直接访问服务器。
使用Query Monitor调试WordPress
对于WordPress网站,Query Monitor插件是最全面的实时调试工具 — 它读取的内容远不止PHP错误。激活后,WordPress管理区域的每个页面加载都会显示一个摘要栏,可以即时访问更深层的面板。
- 数据库查询 — 列出为当前页面执行的每个SQL查询及其执行时间,帮助您识别缓慢或冗余的查询
- PHP错误 — 在上下文中显示警告、通知和已弃用的调用,并提供堆栈跟踪
- 钩子和操作 — 显示哪些钩子已触发以及哪个插件或主题触发它们 — 对诊断插件冲突非常宝贵
- HTTP API调用 — 显示页面加载期间WordPress发出的出站HTTP请求,发现超时或失败的第三方API调用
- 内存使用情况 — 显示每页RAM消耗以识别占用内存的插件
从WordPress插件目录搜索"Query Monitor"进行安装。在推送到面向公众的生产环境之前将其停用,因为调试栏对任何登录的管理员都可见。
保护PHP错误日志免遭公开访问
存储在 public_html 内的日志文件可能对任何知道URL的人都可访问。包含文件路径、数据库名称或堆栈跟踪的日志是攻击者的有用地图。三层保护将消除风险。
选项1 — 将日志移到public_html外(最佳)
将 error_log 指向Web根目录上方的目录:
error_log = /home/username/logs/php_errors.log
public_html 上方的文件无法通过HTTP访问,使这成为最有效的方法。
选项2 — 通过.htaccess阻止
如果日志必须保留在 public_html 内,在 .htaccess 中拒绝浏览器访问:
<FilesMatch "\.(log|txt)$">
Order Allow,Deny
Deny from all
</FilesMatch>
选项3 — 使用不易预测的文件名
将日志从 php_errors.log 重命名为类似 err_a8f3b2c.log 的名称。这使自动发现更困难,但永远不应替代上述选项。
总结:将日志移到public_html上方是最安全的方法。如果不可能,请将.htaccess阻止与不明显的文件名结合,并将日志文件权限设置为600,以便只有您的帐户可以读取它。
比较共享主机上的PHP调试工具
不同的调试工具适合不同的工作流程。下表可帮助您为您的情况选择正确的方法,而不会过度设计。
| 工具 | 最适合 | 优势 | 限制 |
|---|---|---|---|
| PHP错误日志 | 所有PHP应用 | 无需安装;捕获所有错误 | 必须手动打开文件 |
| WP_DEBUG_LOG | WordPress | 易于设置;无需更改php.ini | 仅限WordPress |
| Query Monitor | WordPress | 浏览器中实时;查询+钩子+错误 | 必须在生产环境中停用 |
| var_dump / error_log() | 所有PHP应用 | 精确定位特定变量或行 | 部署前必须删除 |
具有完全配置访问权限的PHP主机
AsiaGB主机支持PHP 7.4 / 8.2 / 8.3,具有可自定义的php.ini、DirectAdmin控制面板和SSD存储。起价仅为500泰铢/年。
查看主机计划