Làm cách nào để có lỗi PHP hiển thị?


1731

Tôi đã kiểm tra tệp PHP ini của tôi ( php.ini) và display_errorsđược đặt và cũng báo cáo lỗi E_ALL. Tôi đã khởi động lại máy chủ web Apache của mình.

Tôi thậm chí đã đặt những dòng này ở đầu tập lệnh của mình và nó thậm chí không bắt được các lỗi phân tích đơn giản. Ví dụ: tôi khai báo các biến bằng a "$"và tôi không đóng các câu lệnh ";". Nhưng tất cả các tập lệnh của tôi hiển thị một trang trống về các lỗi này, nhưng tôi thực sự muốn thấy các lỗi trong đầu ra trình duyệt của mình.

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

Những gì còn lại để làm gì?


8
Tôi vẫn chưa hiểu chính xác lý do tại sao đôi khi nó hoạt động chứ không phải cho người khác, nhưng đối với bất kỳ ai muốn nhanh chóng chuyển các lỗi trong tập lệnh php (hoặc cho phép chúng thông qua một $_REQUESTtham số) thì hai dòng này sẽ hoạt động hầu hết thời gian.
brandonscript

bạn cũng có thể xem chi tiết về lỗi bằng cách bật xdebug từ tệp php ini.
jewhuq

Đây là một bài viết nhanh bao gồm chủ đề - blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

Câu trả lời:


3200

Điều này luôn làm việc cho tôi:

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

Tuy nhiên, điều này không khiến PHP hiển thị các lỗi phân tích cú pháp - cách duy nhất để hiển thị các lỗi đó là sửa đổi php.ini của bạn với dòng này:

display_errors = on

(nếu bạn không có quyền truy cập php.ini, thì việc đặt dòng này cũng .htaccesscó thể hoạt động):

php_flag display_errors 1

9
Cũng lưu ý rằng bạn có thể sử dụng 3 dòng này và sau đó bao gồm ('fileImWorkingOn.php');. Sau đó, bạn có thể bắt lỗi cú pháp quá!
Chụp

14
Mặc dù tôi không có SysOps, tôi nghĩ rằng nhiều người có tệp .htaccess hơn php.ini và cả hai sẽ đến trước khi phân tích cú pháp, phải không? php_flag display_errors 1cho .htaccess
Ryan Taylor

1
Vì vậy, bây giờ các lỗi được đăng nhập, họ đi đâu? Tôi đã đi đến / var / log / apache2 và nó hiển thị tất cả các nhật ký, nhưng không có thông tin nào liên quan đến chương trình tôi mới chạy. Tôi chỉ nhận được thông tin về khởi động lại hệ thống một lần mỗi sáng.
Michael

1
@Michael Các lỗi xảy ra ngay trên màn hình hoặc đến nơi đầu ra được chuyển hướng đến
Fancy John

2
E_ALLkhông đủ để hiển thị tất cả các lỗi trong PHP 5.3. " E_STRICTtrở thành một phần của phiên bản E_ALL5.4.0" - Hướng dẫn sử dụng PHP Bạn cần E_ALL | E_STRICThoặc -1trong phiên bản đó.
Gerard Roche

155

Bạn không thể bắt lỗi phân tích cú pháp khi bật đầu ra lỗi trong thời gian chạy, vì nó phân tích tệp trước khi thực sự thực hiện bất cứ điều gì (và vì nó gặp lỗi trong thời gian này, nên nó sẽ không thực thi bất cứ điều gì). Bạn sẽ cần thay đổi cấu hình máy chủ thực tế để display_errors được bật và mức độ lỗi thông báo lỗi được sử dụng. Nếu bạn không có quyền truy cập vào php.ini, bạn có thể sử dụng .htaccess hoặc tương tự, tùy thuộc vào máy chủ.

Câu hỏi này có thể cung cấp thêm thông tin.


2
Không biết rằng. Tôi đã chỉnh sửa tệp php.ini bằng tay và hiện nó đang hoạt động. Cảm ơn!
Vắng

143

Bên trong php.ini của bạn :

display_errors = on

Sau đó khởi động lại máy chủ web của bạn.


7
+ ①. Trên Ubuntu của tôi /etc/php5/apache2/php.ini
m93a

5
để khởi động lại (Debian, Ubuntu, v.v.)sudo service apache2 restart
Peter Krauss

4
Cho khởi động lại trên OS X sudo apachectl -k restart.
Pea

3
sự thật thú vị: bạn có thể xác định vị trí tệp php.ini của mình được tải nếu bạn chỉ cần đặt vào phpinfo (); vào một tập tin php trống. đó là hàng thứ 7 trở xuống và được gọiLoaded Configuration File
Frankenmint

Làm thế nào chúng ta có thể làm gì nếu chúng ta viết direclty mã php trên cPanel?
arqam

98

Để hiển thị tất cả các lỗi bạn cần phải:

1. Có các dòng này trong tập lệnh PHP mà bạn đang gọi từ trình duyệt (thông thường index.php):

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

2. (a) Đảm bảo rằng tập lệnh này không có lỗi cú pháp

-hoặc là-

2. (b) Đặt display_errors = Ontrong của bạnphp.ini

Nếu không, nó thậm chí không thể chạy 2 dòng đó!

Bạn có thể kiểm tra lỗi cú pháp trong tập lệnh của mình bằng cách chạy (tại dòng lệnh):

php -l index.php

Nếu bạn bao gồm tập lệnh từ tập lệnh PHP khác thì nó sẽ hiển thị lỗi cú pháp trong tập lệnh được bao gồm . Ví dụ:

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

51

Một số nhà cung cấp dịch vụ lưu trữ web cho phép bạn thay đổi các tham số PHP trong .htaccess tệp.

Bạn có thể thêm dòng sau:

php_value display_errors 1

Tôi đã có vấn đề tương tự như của bạn và giải pháp này đã khắc phục nó.


Và nếu bạn đang ở trong môi trường nginx thì hãy thêm giá trị php vào cấu hình trang web của bạn (có sẵn trang web) theo chỉ thị vị trí ~ \ .php. fastcgi_param PHP_VALUE "error_Vporting = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis

40

Bạn có thể thấy tất cả các cài đặt cho "báo cáo lỗi" hoặc "lỗi hiển thị" dường như không hoạt động trong PHP 7. Đó là do xử lý lỗi đã thay đổi. Hãy thử điều này thay thế:

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'];
}

Hoặc, để bắt ngoại lệ và lỗi trong một lần (điều này không tương thích ngược với 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'];
}

1
Ý bạn là PHP7 hay PHP7.1? Tôi bối rối, tôi đã thử như câu trả lời hợp lệ được đề xuất và nó hoạt động, tôi nghĩ rằng bạn đang đề xuất một cái gì đó hơi khác IMHO, thực sự "không tương thích ngược" và nếu bạn phải sửa đổi mã PHP đầy đủ <7 và cần thêm try{} catch() {}mã ở mọi nơi trong mã php đã được xác định của bạn, tôi thậm chí không muốn nghĩ rằng mớ hỗn độn sẽ xảy ra ..
vdegenne

@FancyJohn, điều này có thể giúp : $bt = debug_backtrace(); print_r($bt);.
Frank Forte

@ballangddang, tôi gặp vấn đề với PHP 7.0, trong đó cách duy nhất tôi có thể gặp lỗi để hiển thị là sử dụng các khối try / Catch và bắt cụ thể Error. Nếu bạn viết lại tất cả các yêu cầu (ngoại trừ có thể là JavaScript, CSS, Hình ảnh, v.v.) vào tệp index.php, thì hãy thử khối bắt ở đó, điều đó sẽ dễ dàng hơn. Có, bất kỳ hệ thống nào không có một điểm vào duy nhất sẽ là một vấn đề đau đầu để cập nhật.
Frank Forte

Có phải PHP không hiển thị các ngoại lệ chưa được xử lý? Khá chắc chắn nó làm gì?
Martin Tournoij

Nó sẽ hiển thị các ngoại lệ chưa được xử lý. Nếu bạn bật bộ đệm đầu ra khi bắt đầu (để bạn có thể gửi các tiêu đề tại bất kỳ thời điểm nào trước khi cuối cùng xóa phần thân phản hồi), có thể thông báo ngoại lệ có thể bị mất ở đâu đó.
Frank Forte


33

Sử dụng:

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

Đây là cách tốt nhất để viết nó, nhưng một lỗi cú pháp cho đầu ra trống, vì vậy hãy sử dụng bàn điều khiển để kiểm tra lỗi cú pháp. Cách tốt nhất để gỡ lỗi mã PHP là sử dụng bàn điều khiển; chạy như sau:

php -l phpfilename.php

22

Đặt cái này trong tệp index.php của bạn :

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

20

Tạo một tệp có tên php.ini trong thư mục chứa tệp PHP của bạn.

Bên trong php.ini thêm mã sau đây (Tôi đang đưa ra một lỗi đơn giản hiển thị mã):

display_errors = on

display_startup_errors = on

18

Đây là một đoạn mã PHP:

<?php
    ini_set("display_startup_errors", 1);
    ini_set("display_errors", 1);

    /* Reports for either E_ERROR | E_WARNING | E_NOTICE  | Any Error*/
    error_reporting(E_ALL);

    echo(abc); /* Notice: abc is an undefined constant */
?>

Để được giải thích chi tiết hơn về các lỗi PHP, hãy truy cập Lỗi PHP - error_Vporting () .


2
Điều này khác với câu trả lời của Fancy John như thế nào?
Tất cả công nhân đều cần thiết vào

@cpburnz - Đó là một câu hỏi thẳng thắn, mỗi câu hỏi được đưa ra cùng một bộ mã trong hương vị của chúng là sự khác biệt duy nhất. Tôi đã cung cấp thêm một liên kết URL sẽ cung cấp thêm thông tin về lỗi PHP.
B.Balamanigandan

15

Nếu, mặc dù đã làm theo tất cả các câu trả lời ở trên (hoặc bạn không thể chỉnh sửa tệp php.ini của mình), bạn vẫn không thể nhận được thông báo lỗi, hãy thử tạo một tệp PHP mới cho phép báo cáo lỗi và sau đó bao gồm tệp sự cố. ví dụ:

error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');

Mặc dù có mọi thứ được đặt đúng trong php.initệp của tôi , đây là cách duy nhất tôi có thể gặp lỗi không gian tên. Kịch bản chính xác của tôi là:

//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 {
    ...
}

1
Không, báo cáo lỗi không phải là loglevel, nó là một bitfield. Sử dụng 999999 là một ý tưởng rất tồi , sử dụng một số trừ 2, ví dụ 2047!
peterh - Tái lập Monica

Bạn hoàn toàn đúng, @peterh! Tôi đã thay đổi nó thành E_ALL vì điều này sẽ cho phép báo cáo tất cả các lỗi (ngoại trừ các lỗi nghiêm trọng trong php 5.4 trở xuống).
jxmallett

15

Tôi thường sẽ đi với đoạn mã sau trong các dự án PHP đơn giản của mình.

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.');
    }
}


14

Nếu bạn bằng cách nào đó thấy mình trong một tình huống mà bạn không thể sửa đổi cài đặt thông qua php.inihoặc .htaccessbạn không gặp may khi hiển thị lỗi khi các tập lệnh PHP của bạn có lỗi phân tích cú pháp. Sau đó, bạn phải giải quyết các tệp trên dòng lệnh như thế này:

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

Nếu máy chủ của bạn bị khóa đến mức nó không cho phép thay đổi giá trị thông qua php.inihoặc .htaccess, nó cũng có thể không cho phép thay đổi giá trị thông qua ini_set. Bạn có thể kiểm tra xem với đoạn mã PHP sau:

<?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'đơn giản hơn
bánh nướng

14

Vì chúng tôi hiện đang chạy PHP 7, các câu trả lời được đưa ra ở đây không còn đúng nữa. Người duy nhất vẫn OK là người từ Frank Forte , khi anh nói về PHP 7.

Mặt khác, thay vì cố gắng bắt lỗi bằng cách thử / bắt, bạn có thể sử dụng một mẹo: sử dụng bao gồm.

Đây là ba đoạn mã:

Tập tin: tst1.php

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

Chạy cái này trong PHP 7 sẽ không hiển thị gì cả.

Bây giờ, hãy thử điều này:

Tập tin: tst2.php

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

Tập tin: tst3.php

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

Bây giờ hãy chạy tst2 để đặt báo cáo lỗi và sau đó bao gồm tst3. Bạn sẽ thấy:

Lỗi phân tích cú pháp: lỗi cú pháp, kết thúc tệp không mong muốn, biến mong đợi (T_VARIABLE) hoặc $ {(T_DOLLAR_OPEN_CURLY_BRACES) hoặc {$ (T_CURLY_OPEN) trong tst3.php trên dòng 4


13

Bạn có thể làm một cái gì đó như dưới đây:

Đặt các tham số bên dưới trong tệp chỉ mục chính của bạn:

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

Sau đó, dựa trên yêu cầu của bạn, bạn có thể chọn mà bạn muốn hiển thị:

Đối với tất cả các lỗi, cảnh báo và thông báo:

    error_reporting(E_ALL); OR error_reporting(-1);

Đối với tất cả các lỗi:

    error_reporting(E_ERROR);

Đối với tất cả các cảnh báo:

    error_reporting(E_WARNING);

Đối với tất cả các thông báo:

    error_reporting(E_NOTICE);

Để biết thêm thông tin, kiểm tra ở đây .


Là gì "chính chỉ số tập tin" ? Tập tin index.html?
Peter Mortensen

12

Bạn có thể thêm trình xử lý lỗi tùy chỉnh của riêng bạn, có thể cung cấp thêm thông tin gỡ lỗi. Hơn nữa, bạn có thể thiết lập nó để gửi cho bạn thông tin qua email.

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

7

Mã này trên đầu nên hoạt động:

error_reporting(E_ALL);

Tuy nhiên, hãy thử chỉnh sửa mã trên điện thoại trong tệp:

error_reporting =on

6

Giải pháp tốt nhất / dễ dàng / nhanh chóng mà bạn có thể sử dụng nếu đó là cách gỡ lỗi nhanh, là bao quanh mã của bạn với các ngoại lệ. Đó là những gì tôi đang làm khi tôi muốn kiểm tra một cái gì đó nhanh chóng trong sản xuất.

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

Đối với php7, catch (Throwable $e)tốt hơn ... Hoặc một khối bắt khác bên dướicatch(Error $e)
Frank Forte


4

Đó là những gì tôi học được. Trong tệp PHP.INI,

error_reporting = E_ALL
display_errors = On

2
Thay đổi trong? Thêm vào?
Peter Mortensen

atm câu trả lời của bạn không có ý nghĩa vì thiếu ngữ cảnh của nó; cũng được quy định bởi Peter Mortensen. Không cải thiện nó trước "cờ để loại bỏ" (bởi bot). (Từ đánh giá chất lượng thấp).
ZF007

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

Trong khi trang web của bạn đang hoạt động, php.initệp sẽ bị vô hiệu hóa display_errors vì lý do bảo mật. Tuy nhiên, đối với môi trường phát triển, display_errors có thể được bật để khắc phục sự cố.


4

Bạn có thể làm điều này bằng cách thay đổi tệp php.ini và thêm vào như sau

display_errors = on
display_startup_errors = on

HOẶC bạn cũng có thể sử dụng mã sau đây vì mã này luôn hoạt động với tôi

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

3

Nếu bạn đã cài đặt Xdebug, bạn có thể ghi đè mọi cài đặt bằng cách cài đặt:

xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;

Force_display_errors

Loại: int, Giá trị mặc định: 0, Được giới thiệu trong Xdebug> = 2.3 Nếu cài đặt này được đặt thành 1 thì các lỗi sẽ luôn được hiển thị, bất kể cài đặt display_errors của PHP là gì.

lực lượng

Loại: int, Giá trị mặc định: 0, Được giới thiệu trong Xdebug> = 2.3 Cài đặt này là một bitmask, giống như error_Vporting. Bitmask này sẽ được OR một cách hợp lý với bitmask được biểu thị bằng error_Vporting để xác định những lỗi nào sẽ được hiển thị. Cài đặt này chỉ có thể được thực hiện trong php.ini và cho phép bạn buộc một số lỗi nhất định không được hiển thị cho dù ứng dụng có làm gì với ini_set ().


3

Bạn có thể muốn sử dụng mã này:

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

2

Báo cáo tất cả các lỗi ngoại trừ E_NOTICE

error_reporting(E_ALL & ~E_NOTICE);

Hiển thị tất cả các lỗi PHP

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

Tắt tất cả báo cáo lỗi

error_reporting(0);

1

Trong Unix CLI , việc chuyển hướng chỉ các lỗi sang một tệp là rất thiết thực :

./script 2> errors.log

Sau đó, từ một vỏ khác, để thay đổi trực tiếp:

tail -f errors.log

hoặc đơn giản

watch cat errors.log

Làm thế nào mà trả lời câu hỏi này về PHP?
Peter Mortensen

./scriptlà một tập lệnh php CLI (hashbang #!/usr/bin/php). Bạn có thể chuyển hướng các lỗi php trong một tệp theo cách này. Đây là đường ống unix. Đây không phải là php như CGI.
NVRM

0

Nếu nó nằm trên dòng lệnh, bạn có thể chạy phpvới -ddisplay_errors=1để ghi đè cài đặt trong php.ini:

php -ddisplay_errors=1 script.php

-1

Khác với php.inivà các ini_set()hàm trong tập lệnh PHP, bạn có thể thực hiện điều tương tự với .htaccesshttpd.conf các lệnh được hiển thị bên dưới.

Một số nhà cung cấp dịch vụ lưu trữ cho phép đặt cài đặt PHP thông qua .htaccesshttpd.conf .

Ẩn các lỗi PHP

php_flag display_startup_errors ON

php_flag display_errors ON

php_flag html_errors ON

php_flag log_errors on

php_flag ignore_repeated_errors off

php_flag ignore_repeated_source off

php_flag report_memleaks on

php_flag track_errors on

php_value docref_root 0

php_value docref_ext 0

php_value error_log /home/path/public_html/domain/PHP_errors.log

php_value error_reporting 999999999

php_value error_reporting -1

php_value log_errors_max_len 0

Order allow,deny

Deny from all

Satisfy All

tìm thấy câu trả lời này bằng cách googling một chút

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.