Bagaimana cara saya menampilkan kesalahan PHP?


1731

Saya telah memeriksa file PHP ini saya ( php.ini) dan display_errorssudah diatur dan juga pelaporan kesalahan E_ALL. Saya telah memulai kembali server web Apache saya.

Saya bahkan telah meletakkan baris-baris ini di bagian atas skrip saya, dan bahkan tidak menangkap kesalahan parse sederhana. Sebagai contoh, saya mendeklarasikan variabel dengan a "$"dan saya tidak menutup pernyataan ";". Tetapi semua skrip saya menampilkan halaman kosong pada kesalahan ini, tetapi saya ingin benar-benar melihat kesalahan dalam output browser saya.

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

Apa yang tersisa untuk dilakukan?


8
Saya belum tahu persis mengapa ini bekerja kadang-kadang dan bukan yang lain, tetapi bagi siapa pun yang ingin dengan cepat beralih kesalahan dalam skrip php (atau mengaktifkannya melalui $_REQUESTparameter) dua baris ini akan bekerja sebagian besar waktu.
naskah merek

Anda bisa melihat detail kesalahan dengan mengaktifkan xdebug dari file php ini.
jewelhuq

Inilah artikel singkat yang membahas topik ini - blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

Jawaban:


3200

Ini selalu bekerja untuk saya:

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

Namun, ini tidak membuat PHP menampilkan kesalahan parse - satu-satunya cara untuk menunjukkan kesalahan itu adalah dengan memodifikasi php.ini Anda dengan baris ini:

display_errors = on

(jika Anda tidak memiliki akses php.ini, maka memasukkan baris ini .htaccessmungkin juga berfungsi):

php_flag display_errors 1

9
Perhatikan juga bahwa Anda dapat menggunakan 3 baris ini, dan kemudian sertakan ('fileImWorkingOn.php') ;. Maka Anda juga dapat menangkap kesalahan sintaks!
Jepret

14
Walaupun saya bukan SysOps, saya pikir lebih banyak orang memiliki file .htaccess daripada php.ini, dan keduanya akan muncul sebelum parsing, bukan? php_flag display_errors 1untuk .htaccess
Ryan Taylor

1
Jadi sekarang kesalahannya dicatat, kemana mereka pergi? Saya pergi ke / var / log / apache2 dan itu menunjukkan semua log, tetapi tidak ada informasi mengenai program yang baru-baru ini saya jalankan. Saya hanya mendapatkan informasi tentang sistem restart sekali setiap pagi.
Michael

1
@Michael Kesalahan langsung ke layar atau ke tempat output diarahkan ke
Fancy John

2
E_ALLtidak cukup untuk menampilkan semua kesalahan di PHP 5.3. " E_STRICTmenjadi bagian dari E_ALLdalam 5.4.0" - Panduan PHP yang Anda perlukan E_ALL | E_STRICTatau -1dalam versi itu.
Gerard Roche

155

Anda tidak dapat menangkap kesalahan parse ketika mengaktifkan output kesalahan saat runtime, karena mengurai file sebelum benar-benar mengeksekusi apa pun (dan karena mengalami kesalahan selama ini, ia tidak akan mengeksekusi apa pun). Anda harus mengubah konfigurasi server yang sebenarnya sehingga display_errors aktif dan tingkat error_reporting yang tepat digunakan. Jika Anda tidak memiliki akses ke php.ini, Anda mungkin dapat menggunakan .htaccess atau yang serupa, tergantung pada server.

Pertanyaan ini dapat memberikan info tambahan.


2
Tidak tahu itu. Saya mengedit file php.ini secara manual dan sekarang berfungsi. Terima kasih!
Abs

143

Di dalam php.ini Anda :

display_errors = on

Kemudian restart server web Anda.


7
+ ①. Di ubuntu
/etc/php5/apache2/php.ini

5
untuk memulai ulang (Debian, Ubuntu, dll.)sudo service apache2 restart
Peter Krauss

4
Untuk restart pada OS X sudo apachectl -k restart.
Kacang

3
fakta menyenangkan: Anda dapat menemukan file php.ini Anda dimuat jika Anda cukup memasukkan phpinfo (); menjadi file php kosong. itu baris ke-7 ke bawah dan memanggilLoaded Configuration File
Frankenmint

Bagaimana bisa kita lakukan jika kita menulis direclty kode php di cPanel?
arqam

98

Untuk menampilkan semua kesalahan, Anda perlu:

1. Miliki baris-baris ini dalam skrip PHP yang Anda panggil dari browser (biasanya index.php):

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

2. (a) Pastikan skrip ini tidak memiliki kesalahan sintaksis

-atau-

2. (b) Diatur display_errors = Ondalamphp.ini

Kalau tidak, ia bahkan tidak bisa menjalankan 2 baris itu!

Anda dapat memeriksa kesalahan sintaksis dalam skrip Anda dengan menjalankan (pada baris perintah):

php -l index.php

Jika Anda memasukkan skrip dari skrip PHP lain maka skrip tersebut akan menampilkan kesalahan sintaksis dalam skrip yang disertakan . Sebagai contoh:

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

Beberapa penyedia hosting web memungkinkan Anda untuk mengubah parameter PHP dalam .htaccessfile.

Anda dapat menambahkan baris berikut:

php_value display_errors 1

Saya memiliki masalah yang sama dengan Anda dan solusi ini memperbaikinya.


Dan jika Anda berada di lingkungan nginx maka tambahkan nilai php ke konfigurasi situs Anda (situs-tersedia) di bawah direktif lokasi ~ \ .php. fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis

40

Anda mungkin menemukan semua pengaturan untuk "pelaporan kesalahan" atau "kesalahan tampilan" tampaknya tidak berfungsi di PHP 7. Itu karena penanganan kesalahan telah berubah. Coba ini sebagai gantinya:

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

Atau, untuk menangkap pengecualian dan kesalahan sekaligus (ini tidak kompatibel dengan 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
Apakah maksud Anda PHP7 atau PHP7.1? Saya bingung, saya mencoba sebagai jawaban tervalidasi yang diajukan dan berfungsi, saya pikir Anda mengusulkan sesuatu yang sedikit berbeda IMHO, memang "tidak ada kompatibilitas mundur" dan jika Anda harus memodifikasi kode PHP lengkap <7 dan perlu menambahkan try{} catch() {}kode di mana-mana dalam kode php yang sudah Anda tentukan, saya bahkan tidak ingin memikirkan kekacauan yang akan terjadi ..
vdegenne

@FancyJohn, ini bisa membantu: $bt = debug_backtrace(); print_r($bt);.
Frank Forte

@ballangddang, saya mengalami masalah dengan PHP 7.0, di mana satu-satunya cara saya bisa mendapatkan kesalahan untuk ditampilkan adalah menggunakan blok try / catch dan secara khusus menangkap Error. Jika Anda menulis ulang semua permintaan (kecuali mungkin JavaScript, CSS, Gambar, dll.) Ke file index.php, maka coba blok catch di sana, itu membuatnya lebih mudah. Ya, sistem apa pun yang tidak memiliki titik masuk tunggal akan menjadi sakit kepala utama untuk diperbarui.
Frank Forte

Apakah PHP tidak menunjukkan pengecualian yang tidak ditangani? Cukup yakin ya?
Martin Tournoij

Itu harus menunjukkan pengecualian tidak tertangani. Jika Anda menghidupkan buffer output di awal (sehingga Anda dapat mengirim header di titik mana pun sebelum akhirnya membilas badan respons) mungkin pesan pengecualian bisa hilang di suatu tempat.
Frank Forte


33

Menggunakan:

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

Ini adalah cara terbaik untuk menulisnya, tetapi kesalahan sintaks memberikan output kosong, jadi gunakan konsol untuk memeriksa kesalahan sintaks. Cara terbaik untuk men-debug kode PHP adalah dengan menggunakan konsol; jalankan yang berikut ini:

php -l phpfilename.php

22

Setel ini di file index.php Anda :

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

20

Buat file bernama php.ini di folder tempat file PHP Anda berada.

Di dalam php.ini tambahkan kode berikut (Saya memberikan kode kesalahan sederhana):

display_errors = on

display_startup_errors = on

18

Berikut ini skrip 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 */
?>

Untuk penjelasan lebih rinci tentang kesalahan PHP, kunjungi Kesalahan PHP - error_reporting () .


2
Apa bedanya dengan jawaban Fancy John ?
Semua Pekerja Penting

@ cpburnz - Ini adalah pertanyaan langsung, setiap orang diberikan serangkaian kode yang sama dalam rasa mereka bahwa satu-satunya perbedaan. Saya memberikan tautan URL tambahan yang akan memberikan lebih banyak informasi tentang kesalahan PHP.
B.Balamanigandan

15

Jika, meskipun mengikuti semua jawaban di atas (atau Anda tidak dapat mengedit file php.ini), Anda masih tidak bisa mendapatkan pesan kesalahan, coba buat file PHP baru yang memungkinkan pelaporan kesalahan dan kemudian sertakan file masalah. misalnya:

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

Meskipun semuanya telah diatur dengan benar di php.inifile saya , ini adalah satu-satunya cara saya bisa menangkap kesalahan namespace Skenario persis saya adalah:

//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
Tidak, pelaporan kesalahan bukanlah loglevel, ini adalah bitfield. Menggunakan 999999 adalah ide yang sangat buruk , gunakan beberapa kekuatan dua minus 1, misalnya 2047!
peterh

Anda benar sekali, @peterh! Saya telah mengubahnya ke E_ALL karena ini akan memungkinkan pelaporan semua kesalahan (kecuali kesalahan ketat di php 5.4 dan di bawah).
jxmallett

15

Saya biasanya pergi dengan kode berikut dalam proyek PHP biasa saya.

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

Jika Anda entah bagaimana menemukan diri Anda dalam situasi di mana Anda tidak dapat mengubah pengaturan melalui php.iniatau .htaccessAnda kurang beruntung untuk menampilkan kesalahan ketika skrip PHP Anda mengandung kesalahan parse. Anda kemudian harus memutuskan untuk menyisir file pada baris perintah seperti ini:

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

Jika host Anda begitu terkunci sehingga tidak memungkinkan untuk mengubah nilai melalui php.iniatau .htaccess, itu juga dapat melarang mengubah nilai melalui ini_set. Anda dapat memeriksanya dengan skrip PHP berikut:

<?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'lebih sederhana
scone

14

Karena kami sekarang menjalankan PHP 7, jawaban yang diberikan di sini tidak benar lagi. Satu-satunya yang masih oke adalah yang dari Frank Forte , saat ia berbicara tentang PHP 7.

Di sisi lain, alih-alih mencoba menangkap kesalahan dengan mencoba / menangkap, Anda dapat menggunakan trik: gunakan sertakan.

Berikut tiga kode:

File: tst1.php

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

Menjalankan ini di PHP 7 tidak akan menunjukkan apa-apa.

Sekarang, coba ini:

File: tst2.php

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

File: tst3.php

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

Sekarang jalankan tst2 yang mengatur pelaporan kesalahan, dan kemudian sertakan tst3. Kamu akan lihat:

Kesalahan Parse: kesalahan sintaksis, akhir file yang tidak terduga, variabel yang diharapkan (T_VARIABLE) atau $ {(T_DOLLAR_OPEN_CURLY_BRACES) atau {$ (T_CURLY_OPEN) di tst3.php pada baris 4


13

Anda dapat melakukan sesuatu seperti di bawah ini:

Setel parameter di bawah ini dalam file indeks utama Anda:

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

Kemudian berdasarkan kebutuhan Anda, Anda dapat memilih yang ingin Anda tampilkan:

Untuk semua kesalahan, peringatan dan pemberitahuan:

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

Untuk semua kesalahan:

    error_reporting(E_ERROR);

Untuk semua peringatan:

    error_reporting(E_WARNING);

Untuk semua pemberitahuan:

    error_reporting(E_NOTICE);

Untuk informasi lebih lanjut, periksa di sini .


Apa itu "file indeks utama" ? File index.html?
Peter Mortensen

12

Anda dapat menambahkan penangan kesalahan khusus Anda sendiri, yang dapat memberikan informasi debug tambahan. Selanjutnya, Anda dapat mengaturnya untuk mengirimkan informasi kepada Anda melalui 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

Kode di atas ini berfungsi:

error_reporting(E_ALL);

Namun, cobalah untuk mengedit kode pada ponsel di file:

error_reporting =on

6

Solusi terbaik / mudah / cepat yang dapat Anda gunakan jika itu adalah debugging cepat, adalah mengelilingi kode Anda dengan menangkap pengecualian. Itulah yang saya lakukan ketika saya ingin memeriksa sesuatu yang cepat dalam produksi.

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

Untuk php7, catch (Throwable $e)lebih baik ... Atau blok tangkap lain di bawahnyacatch(Error $e)
Frank Forte


4

Itu yang saya pelajari. Dalam file PHP.INI,

error_reporting = E_ALL
display_errors = On

2
Berubah? Menambah?
Peter Mortensen

atm jawaban Anda tidak masuk akal karena konteksnya kurang; juga ditetapkan oleh Peter Mortensen. Tidak memperbaikinya mempersiapkannya untuk "flag untuk dihapus" (berdasarkan bot). (Dari Ulasan Berkualitas Rendah).
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);
    ?>

Saat situs Anda tayang, php.inifile tersebut seharusnya menonaktifkan display_error untuk alasan keamanan. Namun, untuk lingkungan pengembangan, display_errors dapat diaktifkan untuk pemecahan masalah.


4

Anda dapat melakukan ini dengan mengubah file php.ini dan menambahkan yang berikut ini

display_errors = on
display_startup_errors = on

ATAU Anda juga dapat menggunakan kode berikut karena ini selalu berhasil untuk saya

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

3

Jika Anda telah menginstal Xdebug, Anda dapat menimpa setiap pengaturan dengan mengatur:

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

force_display_errors

Ketik: int, Nilai default: 0, Diperkenalkan di Xdebug> = 2.3 Jika pengaturan ini diatur ke 1 maka kesalahan akan selalu ditampilkan, tidak peduli apa pengaturan display_errors PHP.

force_error_reporting

Ketik: int, Nilai default: 0, Diperkenalkan di Xdebug> = 2.3 Pengaturan ini adalah bitmask, seperti error_reporting. Bitmask ini akan secara logis ORed dengan bitmask yang diwakili oleh error_reporting ke dermine mana kesalahan harus ditampilkan. Pengaturan ini hanya dapat dibuat di php.ini dan memungkinkan Anda untuk memaksa kesalahan tertentu agar tidak ditampilkan apa pun yang dilakukan aplikasi dengan ini_set ().


3

Anda mungkin ingin menggunakan kode ini:

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

2

Laporkan semua kesalahan kecuali E_NOTICE

error_reporting(E_ALL & ~E_NOTICE);

Tampilkan semua kesalahan PHP

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

Matikan semua pelaporan kesalahan

error_reporting(0);

1

Di Unix CLI , sangat praktis untuk mengarahkan hanya kesalahan ke file :

./script 2> errors.log

Kemudian dari shell lain, untuk perubahan langsung:

tail -f errors.log

atau sederhana

watch cat errors.log

Bagaimana cara menjawab pertanyaan ini tentang PHP?
Peter Mortensen

./scriptadalah skrip php CLI (hashbang #!/usr/bin/php). Anda dapat mengarahkan kesalahan php dalam file dengan cara ini. Ini adalah unix piping. Ini bukan php sebagai CGI.
NVRM

0

Jika ada di baris perintah, Anda dapat menjalankan phpdengan -ddisplay_errors=1menimpa pengaturan di php.ini:

php -ddisplay_errors=1 script.php

-1

Selain php.inidan ini_set()fungsi dalam skrip PHP, Anda dapat melakukan hal yang sama dengan .htaccessdanhttpd.conf arahan yang ditunjukkan di bawah ini.

Beberapa penyedia hosting memungkinkan pengaturan pengaturan PHP melalui .htaccessdanhttpd.conf .

Sembunyikan kesalahan 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

menemukan jawaban ini dengan googling sedikit

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.