如何让PHP错误显示?

我已经检查了我的PHP ini文件(php.ini)并且设置了display_errors并且错误报告是E_ALL。我已经重新启动了我的Apache网络服务器。

我甚至把这些行放在我的脚本的顶部,它甚至没有捕获简单的解析错误。例如,我用"$"声明变量,我不关闭语句";"。但是我所有的脚本都在这些错误上显示了一个空白页面,但我想在浏览器输出中看到错误

error_reporting(E_ALL);ini_set('display_errors', 1);

还剩下什么要做?

3338360 次浏览

在运行时启用错误输出时,你无法捕获解析错误,因为它会在实际执行任何内容之前解析文件(并且由于在此期间遇到错误,它不会执行任何内容)。你需要更改实际的服务器配置,以便display_errors并使用适当的error_reporting级别。如果你没有访问php.ini的权限,你可能可以使用. htaccess或类似的,具体取决于服务器。

这个问题可以提供额外的信息。

在你的php.ini

display_errors = on

然后重新启动您的Web服务器。

一些网络托管提供商允许您更改.htaccess文件中的PHP参数。

您可以添加以下行:

php_value display_errors 1

我和你有同样的问题,这个解决方案解决了它。

要显示所有错误,您需要:

1.在您从浏览器调用的PHP脚本中包含以下行(通常为index.php):

error_reporting(E_ALL);ini_set('display_errors', '1');

2.(a)确保该脚本没有语法错误

-或者-

2.(b)在你的php.ini中设置display_errors = On

否则,它甚至不能运行这两条线!

您可以通过运行(在命令行)检查脚本中的语法错误:

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

这总是为我工作:

ini_set('display_errors', '1');ini_set('display_startup_errors', '1');error_reporting(E_ALL);

但是,这并不能使PHP显示解析错误——显示这些错误的唯一方法是用这行修改您的php.ini:

display_errors = on

(如果您无法访问php.ini,那么将这一行放在.htaccess中也可能有效):

php_flag display_errors 1

这将工作:

<?phperror_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.phpnamespace a\b;class x {...}
//file2.phpnamespace c\d;use c\d\x; //Dies because it's not sure which 'x' class to useclass x {...}

如果您以某种方式发现自己处于无法通过php.ini.htaccess修改设置的情况,那么当您的PHP脚本包含解析错误时,您会因为显示错误而倒霉。然后您必须像这样解析到在命令行上显示文件

find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"

如果您的主机被锁定到不允许通过php.ini.htaccess更改值,它也可能不允许通过ini_set更改值。您可以使用以下PHP脚本检查:

<?phpif( !ini_set( 'display_errors', 1 ) ) {echo "display_errors cannot be set.";} else {echo "changing display_errors via script is possible.";}

您可能会发现“错误报告”或“显示错误”的所有设置在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'];}

用途:

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|E_STRICT);break;
case 'PRODUCTION':$base_url = 'Production URL'; /* https://google.com */error_reporting(0);/* 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);

有关更多信息,请查看这里

如果是快速调试,您可以使用的最佳/简单/快速解决方案是在代码周围使用捕获异常。当我想在生产中快速检查某些内容时,这就是我所做的。

try {// Page code}catch (Exception $e) {echo 'Caught exception: ',  $e->getMessage(), "\n";}

上面的这段代码应该可以工作:

error_reporting(E_ALL);

但是,请尝试在文件中编辑手机上的代码:

error_reporting =on

由于我们现在正在运行PHP 7,这里给出的答案不再正确。唯一还可以的是Frank Forte的那个,因为他谈到了PHP 7。

另一方面,与其尝试使用try/catch来捕获错误,不如使用技巧:使用包括。

这里有三段代码:

文件:tst1.php

<?phperror_reporting(E_ALL);ini_set('display_errors', 'On');// Missing " and ;echo "Testing?>

在PHP 7中运行它不会显示任何内容。

现在,试试这个:

文件:tst2.php

<?phperror_reporting(E_ALL);ini_set('display_errors', 'On');include ("tst3.php");?>

文件:tst3.php

<?php// Missing " and ;echo "Testing?>

现在运行设置错误报告的tst2,然后包含tst3。你会看到:

解析错误:语法错误,意外的文件结尾,期望变量(T_VARIABLE)或${(T_DOLLAR_OPEN_CURLY_BRACES)或{$(T_CURLY_OPEN)在第4行tst3.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");

将此设置在您的index.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

Type: int,默认值:0,在Xdebug中引入>=2.3如果这是设置为1,则错误将始终显示,无论PHP的display_errors是什么?

force_error_reporting

Type: int,默认值:0,在Xdebug中引入>=2.3此设置是位掩码,类似error_reporting。此位掩码将与error_reporting表示的位掩码进行逻辑ORED,以确定应显示哪些错误。此设置只能在php.ini中进行,并且允许您强制显示某些错误,无论应用程序如何使用ini_set()。

    <?php// Turn off error reportingerror_reporting(0);
// Report runtime errorserror_reporting(E_ERROR | E_WARNING | E_PARSE);
// Report all errorserror_reporting(E_ALL);
// Same as error_reporting(E_ALL);ini_set("error_reporting", E_ALL);
// Report all errors except E_NOTICEerror_reporting(E_ALL & ~E_NOTICE);?>

当您的站点处于活动状态时,出于安全原因,应该display_errors禁用php.ini文件。但是,对于开发环境,可以启用display_errors进行故障排除。

您可能要使用此代码:

ini_set('display_errors', 1);ini_set('display_startup_errors', 1);error_reporting(E_ALL);

您可以通过更改php.ini文件并添加以下内容来做到这一点

display_errors = ondisplay_startup_errors = on

或者你也可以使用以下代码,因为这总是适合我

ini_set('display_errors', 1);ini_set('display_startup_errors', 1);error_reporting(E_ALL);

如果它在命令行上,您可以使用-ddisplay_errors=1运行php来覆盖php.ini中的设置:

php -ddisplay_errors=1 script.php

在UnixCLI中,重定向只有文件错误非常实用:

./script 2> errors.log

从您的脚本中,像往常一样使用var_dump()或等效(STDOUT和STDERR都将收到输出),但只写在日志中文件:

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);

您可以通过简单的方法在显示中显示PHP错误。首先,只需将以下代码放入您的php.ini文件中。

display_errors = on;

(如果您无法访问php.ini,那么将这一行放在. htaccess中也可能有效):

php_flag display_errors 1

或者,您也可以在index.php文件中使用以下代码

ini_set('display_errors', 1);ini_set('display_startup_errors', 1);error_reporting(E_ALL);
     error_reporting(1);ini_set('display_errors', '1');ini_set('display_startup_errors', '1');error_reporting(E_ALL);

把这个放在你的页面的顶部。

在你的代码顶部输入这个

ini_set('display_errors', '1');ini_set('display_startup_errors', '1');error_reporting(E_ALL);

在php.ini文件中,插入:

display_errors = on

这必须工作。

接受的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 onphp_flag display_errors onphp_flag display_startup_errors onphp_value error_reporting 2147483647php_value error_log /var/www/mywebsite.ext/logs/php.error.log

如果您使用的是共享主机计划(如主机)…只需添加

php_flag display_errors 1

. htaccess文件并将其上传到远程文件夹可能不会产生在服务器上生成的实际警告/错误。

您还需要做的是编辑php.ini

这就是你如何通过cPanel(在host gator共享主机上测试)做到这一点计划)

登录到您的cPanel后,搜索MultiPHP INI编辑器。它通常可以在cPanel项目列表中的软件部分找到。

MultiPHP INI编辑器页…您可以停留在基本模式选项卡上,只需检查display_errors行上的按钮。然后点击申请按钮保存。

输入图片描述

重要事项:只要记住在调试完成后将其关闭;因为这不推荐用于公共服务器。

由于不清楚你在什么操作系统上,这些是我的2 Windows美分。如果您使用的是XAMPP,您需要手动创建C:\xampp\php下的logs文件夹。不是你的错,ApacheFriends忽略了这一点。

要阅读并遵循此文件,请执行。

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"      }    }  ]

并在文件夹加载时运行它。