如何让PHP显示错误:高手与新手指南

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

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

开始课程

PHP中的“白屏死机”:如何让错误说话?



每位PHP开发者都遇到过这种情况:代码看似运行正常,但屏幕上却一片空白。没有消息,没有警告。只有白屏和一丝轻微的抓狂感。熟悉吗?这就是经典的“白屏死机”(White Screen of Death — WSOD)。最常见的问题在于PHP错误输出被关闭了。



在Stack Overflow上,问题“How do I get PHP errors to display?”获得了数千次浏览。这并非偶然:配置错误显示是每个开发者必须掌握的基础知识。但仅仅启用display_errors是不够的。你需要理解这对应用程序的性能和安全性有何影响。



在本文中,我们将讨论:

  • 如何在不同环境(本地、服务器、框架)中启用PHP错误;
  • 如何配置error_reporting以实现最佳调试;
  • 为什么在生产环境中显示错误是个坏主意;
  • 如何在不损失性能的情况下记录错误。


开始吧!



为什么PHP不显示错误?三个主要原因



在深入代码之前,让我们先理解错误可能被隐藏的原因。PHP是一种灵活的语言,其行为取决于php.ini的设置、脚本本身以及服务器环境。



1. php.ini设置

罪魁祸首是display_errors指令。默认情况下,在许多主机上它被设置为Off。这是出于安全考虑:在生产环境中向用户显示调用栈是不好的做法。



2. error_reporting()函数

即使display_errors已启用,错误级别也可能过低。例如,error_reporting(0)会隐藏所有内容。或者你可能不小心过滤掉了所需的错误类型(E_NOTICE, E_WARNING)。



3. 脚本执行前的错误

最隐蔽的是php.ini或包含文件中的语法错误。如果PHP甚至无法启动脚本,它就不会执行到你的设置。在这种情况下,可以通过控制台检查语法:php -l file.php。



如何启用PHP错误输出:分步指南



方法1. 编辑php.ini(永久设置)

最可靠的方法是修改php.ini。找到该文件(通常位于/etc/php/或/usr/local/etc/php/)并设置:



display_errors = Onerror_reporting = E_ALL


修改后务必重启服务器:

sudo service apache2 restart# 或对于 nginx + php-fpm:sudo service php8.1-fpm restart


优点:设置对服务器上的所有脚本生效。
缺点:需要服务器访问权限;不适用于共享主机。



方法2. 通过.htaccess(适用于Apache)

如果你没有php.ini的访问权限,但使用Apache,可以使用.htaccess:



php_flag display_errors onphp_value error_reporting 32767  # E_ALL


重要:此方法仅在服务器允许AllowOverride指令时有效。



方法3. 直接在脚本中(用于调试)

最灵活的方式是在特定文件中启用错误。非常适合开发:



<?phpini_set('display_errors', 1);ini_set('display_startup_errors', 1);error_reporting(E_ALL);

// 你的代码echo $undefined_variable; // 会触发Notice?>


请注意display_startup_errors——它会捕获脚本执行前发生的错误(例如,在包含文件时)。



方法4. 框架特定设置(Laravel, Symfony, WordPress)

现代框架有自己的机制。在Laravel

博客

书籍推荐