捕捉代码中的Bug:如何启用PHP错误显示(且不拖慢网站速度)

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么开发者害怕白屏?

\n\n

每位PHP开发者至少都经历过一次这样的情况:代码似乎写好了,但结果却是一个空白页面。没有错误,没有警告。只有寂静和冷汗。熟悉吗?

\n\n

在Stack Overflow上,问题“How do I get PHP errors to display?” 获得了数千次浏览和数百个回答。这并非偶然:正确启用和处理错误是一项基本技能,可以节省数小时的调试时间。但有一个细微差别:错误的配置不仅可能无济于事,还可能降低网站性能,甚至更糟,暴露安全漏洞。

\n\n

在本文中,我们将介绍所有启用PHP错误显示的方法——从本地开发的快速解决方案到生产服务器的安全配置。当然,我们还会讨论优化:如何避免日志过载和网站变慢。

\n\n

快速入门:PHP有哪些类型的错误?

\n\n

在启用显示之前,了解我们面对的是什么很有帮助。PHP会生成几个级别的错误:

\n\n
    \n
  • E_ERROR — 致命错误。脚本停止运行。例如:内存不足、调用不存在的类。
  • \n
  • E_WARNING — 非致命错误。脚本继续运行,但出现了问题。例如:包含一个不存在的文件。
  • \n
  • E_NOTICE — 通知。通常关于小问题(未定义的变量)。
  • \n
  • E_PARSE — 语法错误。在代码执行前发生,运行时难以捕获。
  • \n
  • E_ALL — 包含所有级别,除了E_STRICT(在PHP 8.0之前)。
  • \n
\n\n

请记住:在开发阶段,我们希望看到所有错误。在生产服务器上,只显示关键错误,而且是在日志中,而不是在屏幕上。

\n\n

方法 #1:快速而粗糙——直接在代码中

\n\n

一次性调试的最简单方法是在脚本开头插入两行神奇的代码:

\n\n
<?php\nini_set('display_errors', 1);\nini_set('display_startup_errors', 1);\nerror_reporting(E_ALL);\n?>
\n\n

这里发生了什么?

\n
    \n
  • display_errors — 在屏幕上启用错误显示。
  • \n
  • display_startup_errors — 显示PHP启动时发生的错误(例如,在php.ini中)。
  • \n
  • error_reporting(E_ALL) — 设置报告级别:显示所有内容。
  • \n
\n\n

这种方法非常适合您正在调试的单个文件。但缺点也很明显:您必须记住在部署到生产环境之前删除这些代码行。否则,您可能会向用户展示应用程序的“内部细节”。

\n\n

方法 #2:配置php.ini——全局且永久

\n\n

如果您在本地机器上工作或控制服务器,编辑php.ini会更简单。找到这个文件(通常在 /etc/php/ 或 /usr/local/etc/php/ 中)并修改以下指令:

\n\n
display_errors = On\ndisplay_startup_errors = On\nerror_reporting = E_ALL
\n\n

修改后,不要忘记重启Web服务器:

\n
sudo systemctl restart apache2\n# 或\nsudo systemctl restart nginx php8.1-fpm
\n\n

重要提示: 在生产服务器上,display_errors 应为 Off。相反,应将错误日志记录配置到文件中:

\n\n
display_errors = Off\nlog_errors = On\nerror_log = /var/log/php_errors.log\nerror_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
\n\n

这可以降低输出负载并保护网站数据。

\n\n

方法 #3:通过 .htaccess——适用于共享主机

\n\n

如果您无法访问 php.ini(例如,廉价主机),请在网站根目录使用 .htaccess 文件:

\n\n
php_flag display_errors on\nphp_flag display_startup_errors on\nphp_value error_reporting 32767

博客

书籍推荐