提问人:Abs 提问时间:6/28/2009 最后编辑:ezio4dfAbs 更新时间:9/20/2023 访问量:3484009
如何显示 PHP 错误?
How do I get PHP errors to display?
问:
我已经检查了我的 PHP ini 文件 () 并已设置,并且错误报告是 .我已经重新启动了我的 Apache Web 服务器。php.ini
display_errors
E_ALL
我甚至把这些行放在脚本的顶部,它甚至没有捕捉到简单的解析错误。例如,我用 a 声明变量,并且不关闭语句。但是我所有的脚本都显示了这些错误的空白页,但我想在浏览器输出中实际看到错误。"$"
";"
error_reporting(E_ALL);
ini_set('display_errors', 1);
还有什么可做的?
答:
您无法在运行时启用错误输出的同一文件中捕获分析错误,因为它在实际执行任何内容之前分析文件(并且由于在此期间遇到错误,因此它不会执行任何内容)。您需要更改实际的服务器配置,以便启用display_errors并使用适当的error_reporting级别。如果您无权访问 php.ini,则可以使用 .htaccess 或类似工具,具体取决于服务器。
此问题可能会提供其他信息。
在你的php.ini中:
display_errors = on
然后重新启动 Web 服务器。
评论
sudo service apache2 restart
sudo apachectl -k restart
Loaded Configuration File
ini_get('display_errors')
/etc/php.d/
.htaccess
某些网络托管服务提供商允许您更改文件中的 PHP 参数。.htaccess
您可以添加以下行:
php_value display_errors 1
我遇到了和你一样的问题,这个解决方案解决了它。
评论
要显示所有错误,您需要:
1. 在从浏览器调用的 PHP 脚本中包含以下行(通常为 index.php
):
error_reporting(E_ALL);
ini_set('display_errors', '1');
2.(a) 确保此脚本没有语法错误
- 或者 -
2.(b) 在 php 中设置 display_errors = 打开
.ini
否则,它甚至无法运行这 2 行!
您可以通过运行(在命令行中)来检查脚本中的语法错误:
php -l index.php
如果包含来自另一个 PHP 脚本的脚本,则它将在包含的脚本中显示语法错误。例如:
index.php
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Any syntax errors here will result in a blank screen in the browser
include 'my_script.php';
my_script.php
adjfkj // This syntax error will be displayed in the browser
评论
DEV 环境
这总是对我有用:
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
但是,这不会使 PHP 显示同一文件中发生的解析错误。此外,这些设置可以被 PHP 覆盖。在这些情况下,显示这些错误的唯一方法是使用以下行修改php.ini(或php-fpm.conf):
display_errors = on
(如果您无权访问 ,那么将此行放入也可能有效):php.ini
.htaccess
php_flag display_errors 1
PROD 环境
请注意,上述建议仅适用于 DEV 环境。在实时站点上,它必须是
display_errors = off
log_errors = on
然后,您将能够在错误日志中看到所有错误。请参阅在何处查找 PHP 错误日志
AJAX 调用
如果是 AJAX 调用,请在 DEV 服务器上打开 DevTools (F12),然后打开 “网络” 选项卡。 然后发起您想要查看结果的请求,它将出现在“网络”选项卡中。单击它,然后单击“响应”选项卡。在那里,您将看到确切的输出。
在实时服务器上时,只需检查错误日志即可。
评论
php_flag display_errors 1
E_ALL
不足以显示 PHP 5.3 中的所有错误。“ become part of in 5.4.0” - PHP Manual 您需要或在那个版本中。E_STRICT
E_ALL
E_ALL | E_STRICT
-1
PHP.ini
.htaccess
这将起作用:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
评论
在 PHP 文件所在的文件夹中创建一个名为 php.ini 的文件。
在php.ini中添加以下代码(我给出了一个简单的错误显示代码):
display_errors = on
display_startup_errors = on
如果尽管遵循了上述所有答案(或者您无法编辑 php.ini 文件),您仍然无法收到错误消息,请尝试创建一个启用错误报告的新 PHP 文件,然后包含问题文件。例如:
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');
尽管在我的文件中正确设置了所有内容,但这是我捕获命名空间错误的唯一方法。我的确切情况是:php.ini
//file1.php
namespace a\b;
class x {
...
}
//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
...
}
评论
如果您以某种方式发现自己处于无法修改设置的情况,或者当您的 PHP 脚本包含解析错误时,您不走运地显示错误。然后,您必须解决在命令行上对文件进行 linting 处理,如下所示:php.ini
.htaccess
find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"
如果主机被锁定,不允许通过 或 更改值,则也可能不允许通过 更改值。您可以使用以下 PHP 脚本进行检查:php.ini
.htaccess
ini_set
<?php
if( !ini_set( 'display_errors', 1 ) ) {
echo "display_errors cannot be set.";
} else {
echo "changing display_errors via script is possible.";
}
评论
find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'
更简单
警告:以下答案与事实不符。错误处理中没有任何更改,未捕获的异常与其他错误一样显示。建议的方法必须谨慎使用,因为尽管有display_error设置,但它会无条件地输出错误,并且可能会通过在实时站点上向外部人员泄露敏感信息而构成威胁。
您可能会发现“错误报告”或“显示错误”的所有设置在 PHP 7 中似乎都不起作用。这是因为错误处理已更改。请尝试以下操作:
try{
// Your code
}
catch(Error $e) {
$trace = $e->getTrace();
echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}
或者,一次性捕获异常和错误(这与 PHP 5 不向后兼容):
try{
// Your code
}
catch(Throwable $e) {
$trace = $e->getTrace();
echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}
评论
try{} catch() {}
$bt = debug_backtrace(); print_r($bt);
Error
用:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
这是编写它的最佳方式,但语法错误会给出空白输出,因此请使用控制台检查语法错误。调试PHP代码的最佳方法是使用控制台;运行以下命令:
php -l phpfilename.php
只需写:
error_reporting(-1);
我通常会在我的普通 PHP 项目中使用以下代码。
if(!defined('ENVIRONMENT')){
define('ENVIRONMENT', 'DEVELOPMENT');
}
$base_url = null;
if (defined('ENVIRONMENT'))
{
switch (ENVIRONMENT)
{
case 'DEVELOPMENT':
$base_url = 'http://localhost/product/';
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
break;
case 'PRODUCTION':
$base_url = 'Production URL'; /* https://google.com */
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('display_startup_errors', 0);
ini_set('log_errors', 1); // Mechanism to log errors
break;
default:
exit('The application environment is not set correctly.');
}
}
您可以执行如下操作:
在主索引文件中设置以下参数:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
然后,根据您的要求,您可以选择要显示的内容:
对于所有错误、警告和通知:
error_reporting(E_ALL); OR error_reporting(-1);
对于所有错误:
error_reporting(E_ERROR);
对于所有警告:
error_reporting(E_WARNING);
对于所有通知:
error_reporting(E_NOTICE);
有关更多信息,请查看此处。
评论
index.html
如果是快速调试,则可以使用的最佳/简单/快速解决方案是用捕获异常来包围代码。当我想在生产中快速检查某些东西时,这就是我正在做的事情。
try {
// Page code
}
catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
评论
catch (Throwable $e)
catch(Error $e)
上面的这段代码应该可以工作:
error_reporting(E_ALL);
但是,请尝试在文件中编辑手机上的代码:
error_reporting =on
为了显示解析错误,您可以使用一个技巧来代替在 php.ini 中设置:使用 include。display_errors
以下是三段代码:
文件:tst1.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
// Missing " and ;
echo "Testing
直接运行此文件时,它将不显示任何内容,因为在 php.ini 中设置为 0。display_errors
现在,试试这个:
文件:tst2.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
include ("tst3.php");
文件:tst3.php
<?php
// Missing " and ;
echo "Testing
现在运行 tst2.php 设置错误报告,然后包含 tst3。您将看到:
解析错误:语法错误,意外的文件结尾,期望变量 (T_VARIABLE) 或 ${ (T_DOLLAR_OPEN_CURLY_BRACES) 或 {$ (T_CURLY_OPEN) 在 tst3 中.php第 4 行
评论
init0.php
init1.php
您可以添加自己的自定义错误处理程序,该处理程序可以提供额外的调试信息。此外,您可以将其设置为通过电子邮件向您发送信息。
function ERR_HANDLER($errno, $errstr, $errfile, $errline){
$msg = "<b>Something bad happened.</b> [$errno] $errstr <br><br>
<b>File:</b> $errfile <br>
<b>Line:</b> $errline <br>
<pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";
echo $msg;
return false;
}
function EXC_HANDLER($exception){
ERR_HANDLER(0, $exception->getMessage(), $exception->getFile(), $exception->getLine());
}
function shutDownFunction() {
$error = error_get_last();
if ($error["type"] == 1) {
ERR_HANDLER($error["type"], $error["message"], $error["file"], $error["line"]);
}
}
set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");
在索引.php文件中设置以下内容:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
如果您安装了 Xdebug,则可以通过设置覆盖每个设置:
xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;
force_display_errors
类型:int,默认值:0,在 Xdebug 中引入 >= 2.3 如果这个 设置设置为 1,则无论 PHP display_errors的设置是什么。
force_error_reporting
类型:int,默认值:0,在 Xdebug 中引入 >= 2.3 此设置是位掩码,如error_reporting。此位掩码将在逻辑上与error_reporting表示的位掩码进行 OR 对应显示哪些错误进行 dermine 处理。此设置只能在 php 中进行.ini并允许您强制显示某些错误,无论应用程序如何使用 ini_set()。
<?php
// Turn off error reporting
error_reporting(0);
// Report runtime errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Report all errors
error_reporting(E_ALL);
// Same as error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);
// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
?>
当您的网站处于活动状态时,出于安全原因,该文件应display_errors禁用。但是,对于开发环境,可以启用display_errors进行故障排除。php.ini
如果它在命令行上,您可以运行 with 以覆盖以下设置:php
-ddisplay_errors=1
php.ini
php -ddisplay_errors=1 script.php
在 Unix CLI 中,仅将错误重定向到文件非常实用:
./script 2> errors.log
在脚本中,像往常一样使用或等效(STDOUT 和 STDERR 都将接收输出),但仅在日志文件中写入:var_dump()
fwrite(STDERR, "Debug infos\n"); // Write in errors.log^
然后从另一个 shell 进行实时更改:
tail -f errors.log
或者干脆
watch cat errors.log
评论
报告除E_NOTICE之外的所有错误
error_reporting(E_ALL & ~E_NOTICE);
显示所有 PHP 错误
error_reporting(E_ALL); or ini_set('error_reporting', E_ALL);
关闭所有错误报告
error_reporting(0);
接受的asnwer包括额外的选项。在我的 DEVELOPMENT apache vhost 中的 PHP 文件中(.htaccess,如果您可以确保它不会进入生产环境):
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
但是,这不会使PHP显示解析错误 - 显示这些错误的唯一方法是使用以下行修改php.ini:
display_errors = on
(如果您无权访问 ,那么将此行放入也可能有效):php.ini
.htaccess
// I've added some extra options that set E_ALL as per https://www.php.net/manual/en/errorfunc.configuration.php.
php_flag log_errors on
php_flag display_errors on
php_flag display_startup_errors on
php_value error_reporting 2147483647
php_value error_log /var/www/mywebsite.ext/logs/php.error.log
如果您使用的是 SharedHosting 计划(例如在 hostgator 上)...只需添加
php_flag display_errors 1
添加到 .htaccess 文件并将其上传到远程文件夹可能不会产生服务器上生成的实际警告/错误。
您还需要做的是编辑php.ini
这就是您通过cPanel(在hostgator共享主机上测试)进行操作的方式 计划)
登录到cPanel后,搜索MultiPHP INI编辑器。 它通常位于 cPanel 项目列表的 SOFTWARE 部分下。
在MultiPHP INI编辑器页面上...您可以停留在“基本模式”选项卡上,只需选中行上显示display_errors的按钮即可。 然后单击“应用”按钮进行保存。
重要:只需记住在完成调试后将其关闭即可;因为不建议将此用于公共服务器。
由于不清楚您在什么操作系统上,这些是我的 2 个 Windows 美分。
如果您使用的是 XAMPP,则需要在 下手动创建文件夹。不是你的错,ApacheFriends 省略了这一点。logs
C:\xampp\php
要阅读并关注此文件,请执行。
Get-Content c:\xampp\php\logs\php_error_log -Wait
为此,请在 VSCode 中创建一个任务.vscode\tasks.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Monitor php errors",
"type": "shell",
"command": "Get-Content -Wait c:\\xampp\\php\\logs\\php_error_log",
"runOptions": {
"runOn": "folderOpen"
}
}
]
并让它在文件夹加载时运行。
评论
$_REQUEST