1888

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

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

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

还剩下什么?

4

30 回答 30

3416

这总是对我有用:

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
于 2014-01-29T11:25:17.323 回答
159

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

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

于 2009-06-27T19:14:17.680 回答
150

在你的php.ini里面:

display_errors = on

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

于 2013-01-08T09:27:35.727 回答
103
于 2014-01-29T09:52:43.207 回答
53

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

您可以添加以下行:

php_value display_errors 1

我遇到了和你一样的问题,这个解决方案解决了它。

于 2013-05-18T15:01:34.083 回答
41

您可能会发现“错误报告”或“显示错误”的所有设置在 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'];
}
于 2016-03-28T19:26:51.917 回答
35

这将起作用:

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
于 2014-05-05T13:23:31.893 回答
34

采用:

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

这是最好的编写方法,但是语法错误会给出空白输出,因此请使用控制台检查语法错误。调试 PHP 代码的最佳方式是使用控制台;运行以下命令:

php -l phpfilename.php
于 2016-05-04T19:14:09.630 回答
23

在你的index.php文件中设置它:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
于 2017-09-26T12:32:51.567 回答
20

在 PHP 文件所在的文件夹中创建一个名为php.ini的文件。

在 php.ini 中添加以下代码(我给出了一个显示代码的简单错误):

display_errors = on

display_startup_errors = on
于 2015-03-31T18:38:47.273 回答
16

我通常会在我的普通 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.');
    }
}
于 2017-02-01T07:16:23.143 回答
16

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

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

这里有三段代码:

文件:tst1.php

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

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

现在,试试这个:

文件:tst2.php

<?php
    error_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

于 2017-05-20T12:07:56.927 回答
15

如果尽管遵循了上述所有答案(或者您无法编辑 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 {
    ...
}
于 2015-04-24T02:55:34.157 回答
14

如果您以某种方式发现自己处于无法修改设置的情况,php.ini或者.htaccess当您的 PHP 脚本包含解析错误时,您会因为显示错误而运气不佳。然后,您必须像这样解决在命令行上对文件进行 linting 的问题:

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

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

<?php
if( !ini_set( 'display_errors', 1 ) ) {
  echo "display_errors cannot be set.";
} else {
  echo "changing display_errors via script is possible.";
}
于 2016-01-11T12:11:27.913 回答
13

您可以执行以下操作:

在主索引文件中设置以下参数:

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

如需更多信息,请查看此处

于 2017-02-01T07:33:23.800 回答
12

您可以添加自己的自定义错误处理程序,它可以提供额外的调试信息。此外,您可以将其设置为通过电子邮件向您发送信息。

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");
于 2017-06-04T14:41:28.060 回答
7

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

error_reporting(E_ALL);

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

error_reporting =on
于 2017-05-09T03:28:31.637 回答
6

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

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
于 2017-03-27T02:31:01.800 回答
5
    <?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);
    ?>

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

于 2018-05-24T08:48:07.197 回答
4

写吧:

error_reporting(-1);
于 2017-01-13T18:56:39.757 回答
4

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

display_errors = on
display_startup_errors = on

或者您也可以使用以下代码,因为这对我总是有效

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
于 2019-04-11T08:43:10.630 回答
3

如果您安装了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 表示的位掩码进行逻辑或运算,以确定应显示哪些错误。此设置只能在 php.ini 中进行,并且允许您强制显示某些错误,无论应用程序使用 ini_set() 做什么。

于 2017-10-19T05:45:41.553 回答
3

您可能想使用以下代码:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
于 2019-03-28T12:42:07.973 回答
2

如果它在命令行上,您可以运行phpwith-ddisplay_errors=1以覆盖以下设置php.ini

php -ddisplay_errors=1 script.php
于 2019-10-24T23:11:31.020 回答
2

报告除 E_NOTICE 之外的所有错误

error_reporting(E_ALL & ~E_NOTICE);

显示所有 PHP 错误

error_reporting(E_ALL);  or ini_set('error_reporting', E_ALL);

关闭所有错误报告

error_reporting(0);
于 2019-12-31T10:07:49.623 回答
2
     error_reporting(1);
     ini_set('display_errors', '1');
     ini_set('display_startup_errors', '1');
     error_reporting(E_ALL);

把它放在页面的顶部。

于 2021-02-28T00:51:33.803 回答
1

在 Unix CLI中,仅将错误重定向到文件是非常实用的:

./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
于 2019-11-26T02:28:30.037 回答
1

您可以通过简单的方式在显示器中显示 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);
于 2020-11-06T06:41:09.023 回答
1

在代码顶部输入这个

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

在 php.ini 文件中,插入:

display_errors = on

这必须有效。

于 2021-08-23T21:22:31.543 回答
1

接受的回答包括额外的选项。在我的 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
于 2022-01-08T22:17:03.783 回答