Bagaimana saya bisa mendapatkan pesan kesalahan yang berguna di PHP?

May 10 2009

Cukup sering saya akan mencoba dan menjalankan skrip PHP dan hanya mendapatkan layar kosong kembali. Tidak ada pesan kesalahan; hanya layar kosong. Penyebabnya mungkin kesalahan sintaks sederhana (tanda kurung salah, titik koma hilang), atau panggilan fungsi yang gagal, atau sesuatu yang lain sama sekali.

Sangat sulit untuk mencari tahu apa yang salah. Saya akhirnya mengomentari kode, memasukkan pernyataan "echo" di mana-mana, dll. Mencoba mempersempit masalah. Tapi pasti ada cara yang lebih baik, bukan?

Apakah ada cara agar PHP menghasilkan pesan kesalahan yang berguna, seperti yang dilakukan Java?

Jawaban

510 DarrylHein May 10 2009 at 16:52

Untuk kesalahan sintaks, Anda perlu mengaktifkan tampilan kesalahan di php.ini. Secara default, ini dinonaktifkan karena Anda tidak ingin "pelanggan" melihat pesan kesalahan. Periksa halaman ini dalam dokumentasi PHP untuk informasi tentang 2 arahan: error_reportingdan display_errors. display_errorsmungkin yang ingin Anda ubah. Jika Anda tidak dapat mengubah php.ini, Anda juga dapat menambahkan baris berikut ke file .htaccess:

php_flag  display_errors        on
php_value error_reporting       2039

Anda mungkin ingin mempertimbangkan untuk menggunakan nilai E_ALL (seperti yang disebutkan oleh Gumbo) untuk versi PHP Anda untuk error_reportingmendapatkan semua kesalahan. Info lebih lanjut

3 item lainnya: (1) Anda dapat memeriksa file log kesalahan karena akan memiliki semua kesalahan (kecuali logging telah dinonaktifkan). (2) Menambahkan 2 baris berikut akan membantu Anda men-debug kesalahan yang bukan merupakan kesalahan sintaks:

error_reporting(-1);
ini_set('display_errors', 'On');

(3) Pilihan lainnya adalah menggunakan editor yang memeriksa kesalahan saat Anda mengetik, seperti PhpEd . PhpEd juga dilengkapi dengan debugger yang dapat memberikan informasi lebih detail. (Debugger PhpEd sangat mirip dengan xdebug dan terintegrasi langsung ke editor sehingga Anda menggunakan 1 program untuk melakukan semuanya.)

Tautan Cartman juga sangat bagus:http://www.ibm.com/developerworks/library/os-debug/

458 Eljakim Jul 05 2011 at 02:46

Berikut ini memungkinkan semua kesalahan:

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

Lihat juga tautan berikut

  • http://php.net/manual/en/errorfunc.configuration.php#ini.display-errors
  • http://php.net/manual/en/errorfunc.configuration.php#ini.display-startup-errors
  • http://php.net/manual/en/function.error-reporting.php
176 m4dm4x1337 Aug 13 2013 at 18:59

Kode berikut harus menampilkan semua kesalahan:

<?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last())) { return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array( 0x0001 => 'E_ERROR', 0x0002 => 'E_WARNING', 0x0004 => 'E_PARSE', 0x0008 => 'E_NOTICE', 0x0010 => 'E_CORE_ERROR', 0x0020 => 'E_CORE_WARNING', 0x0040 => 'E_COMPILE_ERROR', 0x0080 => 'E_COMPILE_WARNING', 0x0100 => 'E_USER_ERROR', 0x0200 => 'E_USER_WARNING', 0x0400 => 'E_USER_NOTICE', 0x0800 => 'E_STRICT', 0x1000 => 'E_RECOVERABLE_ERROR', 0x2000 => 'E_DEPRECATED', 0x4000 => 'E_USER_DEPRECATED' ); if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN'; }; return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message))); }; $old_error_handler = set_error_handler("ErrorHandler");

// other php code

?>

Satu-satunya cara untuk menghasilkan halaman kosong dengan kode ini adalah ketika Anda mengalami kesalahan dalam penangan shutdown. Saya menyalin dan menempel ini dari cm saya sendiri tanpa mengujinya, tetapi saya yakin itu berhasil.

61 Tomalak May 10 2009 at 16:54

Anda dapat menyertakan baris berikut dalam file yang ingin Anda debug:

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

Ini mengesampingkan pengaturan default di php.ini, yang hanya membuat PHP melaporkan kesalahan ke log.

61 JamesAnderson Sep 25 2009 at 11:22

Kesalahan dan peringatan biasanya muncul di ....\logs\php_error.logatau ....\logs\apache_error.logtergantung pada pengaturan php.ini Anda.

Juga kesalahan yang berguna sering diarahkan ke browser, tetapi karena bukan html yang valid, kesalahan tersebut tidak ditampilkan.

Jadi "tail -f"file log Anda dan ketika Anda mendapatkan layar kosong gunakan IEs" view "-> opsi menu" source "untuk melihat output mentah.

55 Madara'sGhost Feb 03 2014 at 03:47

Konfigurasi PHP

2 entri di php.ini mendikte output kesalahan:

  1. display_errors
  2. error_reporting

Dalam produksi , display_errorsbiasanya diatur ke Off(Yang merupakan hal yang baik, karena tampilan kesalahan di lokasi produksi umumnya tidak diinginkan!).

Namun, dalam pengembangan , itu harus diatur ke On, sehingga kesalahan bisa ditampilkan. Periksa !

error_reporting(pada PHP 5.3) diatur secara default ke E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(artinya, semuanya ditampilkan kecuali untuk pemberitahuan, standar ketat dan pemberitahuan penghentian). Jika ragu, atur E_ALLke menampilkan semua kesalahan. Periksa !

Whoa whoa! Tidak ada cek! Saya tidak bisa mengubah php.ini saya!

Itu memalukan. Biasanya host bersama tidak mengizinkan perubahan file php.ini mereka, dan karenanya, opsi itu sayangnya tidak tersedia. Tapi jangan takut! Kami punya pilihan lain !

Konfigurasi runtime

Dalam skrip yang diinginkan, kita dapat mengubah entri php.ini secara runtime! Artinya, itu akan berjalan saat skrip dijalankan! Manis!

error_reporting(E_ALL);
ini_set("display_errors", "On");

Kedua baris ini akan melakukan efek yang sama seperti mengubah entri php.ini seperti di atas! Hebat!

Saya masih mendapatkan halaman kosong / kesalahan 500!

Itu berarti skripnya bahkan belum berjalan! Itu biasanya terjadi ketika Anda mengalami kesalahan sintaks!

Dengan kesalahan sintaks, skrip bahkan tidak masuk ke waktu proses. Itu gagal pada waktu kompilasi , artinya itu akan menggunakan nilai-nilai di php.ini, yang jika Anda tidak mengubahnya, mungkin tidak mengizinkan tampilan kesalahan.

Log kesalahan

Selain itu, PHP secara default mencatat kesalahan. Di shared hosting, ini mungkin berada di folder khusus atau di folder yang sama dengan skrip yang melanggar.

Jika Anda memiliki akses ke php.ini, Anda dapat menemukannya di bawah error_logentri.

31 FDisk Sep 25 2009 at 14:48

Saya selalu menggunakan sintaks ini di bagian paling atas dari skrip php.

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off
30 gnarf May 10 2009 at 16:59

Ada ekstensi yang sangat berguna yang disebut " xdebug " yang akan membuat laporan Anda jauh lebih bagus juga.

27 hakre Jan 24 2013 at 22:06

Untuk pemecahan masalah cepat dan langsung yang biasanya saya sarankan di sini di SO:

error_reporting(~0); ini_set('display_errors', 1);

untuk diletakkan di awal naskah yang sedang dalam proses pemecahan masalah. Ini tidak sempurna, varian yang sempurna adalah Anda juga mengaktifkannya di php.inidan Anda mencatat kesalahan di PHP untuk menangkap kesalahan sintaksis dan startup.

Pengaturan yang diuraikan di sini menampilkan semua kesalahan, pemberitahuan dan peringatan, termasuk yang ketat, apa pun versi PHPnya.

Hal-hal berikutnya yang perlu dipertimbangkan:

  • Instal Xdebug dan aktifkan debugging jarak jauh dengan IDE Anda.

Lihat juga:

  • Pelaporan Kesalahan (PHP Cara yang Benar.)
  • Konstanta Standar Docs
  • error_reporting()Docs
  • display_errorsDocs
27 EduardoOliveira Jan 06 2016 at 01:59

Dimungkinkan untuk mendaftarkan hook untuk membuat kesalahan atau peringatan terakhir terlihat.

function shutdown(){
  var_dump(error_get_last());
}

register_shutdown_function('shutdown');

menambahkan kode ini ke awal Anda index.php akan membantu Anda men-debug masalah.

17 RichBradshaw Jul 05 2011 at 02:49

Jika Anda sangat keren, Anda dapat mencoba:

$test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192";

ini_set('display_errors',$test_server);
error_reporting(E_ALL|E_STRICT);

Ini hanya akan menampilkan kesalahan saat Anda menjalankan secara lokal. Ini juga memberi Anda variabel test_server untuk digunakan di tempat lain yang sesuai.

Setiap kesalahan yang terjadi sebelum skrip berjalan tidak akan tertangkap, tetapi untuk 99% kesalahan yang saya buat, itu bukan masalah.

17 Kld May 06 2013 at 21:14

Di bagian atas halaman, pilih parameter

error_reporting(E_ERROR | E_WARNING | E_PARSE);
17 Sherif Nov 12 2015 at 13:24

Ini adalah masalah konfigurasi yang dimuat vs. runtime

Penting untuk diketahui bahwa kesalahan sintaks atau kesalahan penguraian terjadi selama langkah kompilasi atau penguraian , yang berarti bahwa PHP akan melakukan bail bahkan sebelum ia sempat mengeksekusi kode Anda. Jadi, jika Anda memodifikasi display_errorskonfigurasi PHP selama runtime, (ini termasuk apa saja mulai dari penggunaan ini_setdalam kode Anda hingga menggunakan .htaccess, yang merupakan file konfigurasi runtime) maka hanya pengaturan konfigurasi yang dimuat default yang digunakan.

Bagaimana cara menghindari WSOD dalam pengembangan

Untuk menghindari WSOD, Anda ingin memastikan bahwa file konfigurasi yang Anda muat telah display_errorsaktif dan error_reportingdisetel -1( ini setara dengan E_ALL karena memastikan semua bit diaktifkan terlepas dari versi PHP yang Anda jalankan ). Jangan melakukan hardcode nilai konstan E_ALL, karena nilai tersebut dapat berubah di antara versi PHP yang berbeda.

Konfigurasi yang dimuat adalah php.inifile yang Anda muat atau file Anda apache.confatau httpd.confatau file virtualhost. File-file tersebut hanya dibaca sekali selama tahap startup (ketika Anda pertama kali memulai apache httpd atau php-fpm, misalnya) dan hanya diganti dengan perubahan konfigurasi runtime. Memastikan bahwa display_errors = 1dan error_reporting = -1dalam file konfigurasi yang Anda muat memastikan bahwa Anda tidak akan pernah melihat WSOD terlepas dari kesalahan sintaks atau parse yang terjadi sebelum runtime berubah seperti ini_set('display_errors', 1);atau error_reporting(E_ALL);dapat terjadi.

Bagaimana menemukan file konfigurasi Anda (php.ini) yang telah dimuat

Untuk menemukan file konfigurasi yang Anda muat cukup buat file PHP baru hanya dengan kode berikut ...

<?php
phpinfo();

Kemudian arahkan browser Anda ke sana dan lihat File Konfigurasi yang Dimuat dan file .ini Tambahan yang diurai , yang biasanya ada di bagian atas Anda phpinfo()dan akan menyertakan jalur absolut ke semua file konfigurasi yang Anda muat.

Jika Anda melihat (none)alih-alih file, itu berarti Anda tidak memiliki php.ini di Jalur File Konfigurasi (php.ini) . Jadi Anda dapat mengunduh stok php.ini yang dibundel dengan PHP dari sini dan menyalinnya ke jalur file konfigurasi Anda sebagai php.ini lalu pastikan pengguna php Anda memiliki izin yang memadai untuk membaca dari file itu. Anda harus memulai ulang httpd atau php-fpm untuk memuatnya. Ingat, ini adalah file pengembangan php.ini yang disertakan dengan sumber PHP. Jadi tolong jangan gunakan itu dalam produksi!


Hanya saja, jangan lakukan ini dalam produksi

Ini benar-benar cara terbaik untuk menghindari WSOD dalam pengembangan. Siapa pun yang menyarankan agar Anda meletakkan ini_set('display_errors', 1);atau error_reporting(E_ALL);di atas skrip PHP Anda atau menggunakan .htaccess seperti yang Anda lakukan di sini, tidak akan membantu Anda menghindari WSOD ketika terjadi kesalahan sintaks atau parse (seperti dalam kasus Anda di sini) jika file konfigurasi Anda dimuat telah display_errorsdimatikan.

Banyak orang (dan instalasi stok PHP) akan menggunakan file ini produksi yang telah display_errorsdimatikan secara default, yang biasanya menghasilkan rasa frustrasi yang sama seperti yang Anda alami di sini. Karena PHP telah menonaktifkannya saat dijalankan, kemudian menemukan kesalahan sintaks atau parse, dan bail tanpa hasil. Anda berharap bahwa Anda ini_set('display_errors',1);di bagian atas skrip PHP Anda harus menghindari itu, tetapi tidak masalah jika PHP tidak dapat mengurai kode Anda karena tidak akan pernah mencapai runtime.

16 Ram Jul 05 2011 at 02:54

Untuk mempertahankan ini dan membuatnya nyaman, Anda dapat mengedit file php.ini Anda. Biasanya disimpan di /etc/php.iniatau /etc/php/php.ini, tetapi lebih banyak lokal php.inimungkin menimpanya, tergantung pada pedoman penyiapan penyedia hosting Anda. Periksa phpinfo()file Loaded Configuration Filedi bagian atas, untuk memastikan file mana yang dimuat terakhir.

Cari display_errors di file itu. Seharusnya hanya ada 3 contoh, 2 di antaranya diberi komentar.

Ubah baris yang tidak diberi komentar menjadi:

display_errors = stdout
16 Eli Sep 25 2009 at 15:09

Entah apakah itu akan membantu, tetapi ini adalah bagian dari file konfigurasi standar saya untuk proyek php. Saya cenderung tidak terlalu bergantung pada konfigurasi apache bahkan pada server saya sendiri.

Saya tidak pernah memiliki masalah kesalahan menghilang, jadi mungkin sesuatu di sini akan memberi Anda gambaran.

Diedit untuk menampilkan APPLICATON_LIVE

/*
APPLICATION_LIVE will be used in process to tell if we are in a development or production environment.  It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
*/

if ( preg_match( "%^(www.)?livedomain.com$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', true);
} elseif ( preg_match( "%^(www.)?devdomain.net$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', false);
} else {
    die("INVALID HOST REQUEST (".$_SERVER["HTTP_HOST"].")");
    // Log or take other appropriate action.
}


/*
--------------------------------------------------------------------
DEFAULT ERROR HANDLING
--------------------------------------------------------------------
Default error logging.  Some of these may be changed later based on APPLICATION_LIVE.
*/
error_reporting(E_ALL & ~E_STRICT);
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");
ini_set ( "log_errors", 1);
ini_set ( "log_errors_max_len", 0);
ini_set ( "error_log", APPLICATION_ROOT."logs/php_error_log.txt");
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");

if ( ! APPLICATION_LIVE ) {
    // A few changes to error handling for development.
    // We will want errors to be visible during development.
    ini_set ( "display_errors", "1");
    ini_set ( "display_startup_errors", "1");
    ini_set ( "html_errors", "1");
    ini_set ( "docref_root", "http://www.php.net/");
    ini_set ( "error_prepend_string", "<div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'>");
    ini_set ( "error_append_string", "</div>");
}
15 Yan.Zero Aug 19 2014 at 22:36
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

Selain itu, Anda bisa mendapatkan informasi yang lebih detail dengan xdebug .

15 OndřejŠotek Jul 16 2015 at 05:38

Saya merekomendasikan Nette Tracy untuk visualisasi kesalahan dan pengecualian yang lebih baik di PHP:

15 AbuzerFirdousi Dec 05 2017 at 03:54
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
10 ÓlafurWaage May 10 2009 at 16:54
error_reporting(E_ALL | E_STRICT);

Dan aktifkan kesalahan tampilan di php.ini

9 soulmerge May 10 2009 at 16:54

Anda dapat mendaftarkan penangan kesalahan Anda sendiri di PHP. Membuang semua kesalahan ke file dapat membantu Anda dalam kasus yang tidak jelas ini, misalnya. Perhatikan bahwa fungsi Anda akan dipanggil, tidak peduli apa pun error_reporting Anda saat ini. Contoh yang sangat mendasar:

function dump_error_to_file($errno, $errstr) {
    file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');
7 CodeSynthesis Jun 10 2014 at 20:37

Dua baris kunci yang Anda butuhkan untuk mendapatkan kesalahan berguna dari PHP adalah:

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

Seperti yang ditunjukkan oleh kontributor lain, ini dinonaktifkan secara default untuk alasan keamanan. Sebagai tip yang berguna - saat Anda menyiapkan situs Anda, berguna untuk melakukan peralihan untuk lingkungan Anda yang berbeda sehingga kesalahan ini AKTIF secara default di lingkungan lokal dan pengembangan Anda. Ini dapat dicapai dengan kode berikut (idealnya di file index.php atau config Anda jadi ini aktif dari awal):

switch($_SERVER['SERVER_NAME'])
{
    // local
    case 'yourdomain.dev':
    // dev
    case 'dev.yourdomain.com':
        ini_set('display_errors',1);
        error_reporting(E_ALL);
    break;
    //live
    case 'yourdomain.com':
        //...
    break;
}
6 RichBradshaw May 10 2009 at 17:21

FirePHP juga bisa berguna.

6 user577803 Jan 17 2011 at 03:59

buka php.ini Anda, pastikan sudah disetel ke:

display_errors = On

restart server Anda.

6 user1681048 Jun 18 2014 at 08:03

Anda mungkin juga ingin mencoba PHPStorm sebagai editor kode Anda. Ini akan menemukan banyak kesalahan PHP dan sintaksis lainnya tepat saat Anda mengetik di editor.

6 AshutoshJha Nov 10 2014 at 18:23

jika Anda adalah pengguna ubuntu, buka terminal Anda dan jalankan perintah ini

sudo tail -50f /var/log/apache2/error.log

di mana itu akan menampilkan 50 kesalahan baru-baru ini. Ada file kesalahan error.loguntuk apache2 yang mencatat semua kesalahan.

5 DanielSorichetti May 10 2009 at 19:09

Untuk mengaktifkan pelaporan kesalahan lengkap, tambahkan ini ke skrip Anda:

error_reporting(E_ALL);

Hal ini bahkan menyebabkan munculnya peringatan minimal. Dan, untuk berjaga-jaga:

ini_set('display_errors', '1');

Akan memaksa tampilan kesalahan. Ini harus dimatikan di server produksi, tetapi tidak saat Anda mengembangkan.

5 Noname Feb 01 2014 at 13:24

"ERRORS" adalah hal yang paling berguna bagi pengembang untuk mengetahui kesalahan mereka dan menyelesaikannya untuk membuat sistem bekerja dengan sempurna.

PHP menyediakan beberapa cara yang lebih baik untuk mengetahui pengembang mengapa dan di mana bagian kode mereka mendapatkan kesalahan, jadi dengan mengetahui kesalahan tersebut, pengembang dapat membuat kode mereka lebih baik dalam banyak hal.

Cara terbaik untuk menulis dua baris berikut di bagian atas skrip untuk mendapatkan semua pesan kesalahan:

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

Cara lain untuk menggunakan alat debugger seperti xdebug di IDE Anda.

4 AymanHourieh May 10 2009 at 16:58

Anda dapat mengaktifkan pelaporan kesalahan lengkap (termasuk pemberitahuan dan pesan ketat). Beberapa orang menganggap ini terlalu bertele-tele, tetapi patut dicoba. Setel error_reportingke E_ALL | E_STRICTdalam php.ini Anda.

error_reporting = E_ALL | E_STRICT

E_STRICT akan memberi tahu Anda tentang fungsi yang tidak digunakan lagi dan memberi Anda rekomendasi tentang metode terbaik untuk melakukan tugas tertentu.

Jika Anda tidak ingin pemberitahuan, tetapi Anda menemukan jenis pesan lain berguna, coba kecualikan pemberitahuan:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Pastikan juga itu display_errorsdiaktifkan di php.ini. Jika versi PHP Anda lebih lama dari 5.2.4, setel ke On:

display_errors = "On"

Jika versi Anda adalah 5.2.4 atau yang lebih baru, gunakan:

display_errors = "stderr"
4 jmucchiello May 11 2009 at 01:16

Selain error_reporting dan pengaturan display_errors ini, Anda bisa mendapatkan kesalahan SYNTAX dari file log server web Anda. Ketika saya mengembangkan PHP, saya memuat log server web sistem pengembangan saya ke editor saya. Setiap kali saya menguji halaman dan mendapatkan layar kosong, file log menjadi basi dan editor saya bertanya apakah saya ingin memuatnya kembali. Ketika saya melakukannya, saya melompat ke bawah dan ada kesalahan sintaks. Sebagai contoh:

[Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9
3 AVKurov Jul 05 2017 at 16:04

Bagi mereka yang menggunakan nginx dan memiliki layar putih bahkan untuk file <?php echo 123;. Dalam kasus saya, saya tidak memiliki opsi yang diperlukan untuk PHP dalam file konfigurasi nginx:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Opsi ini tidak ada di file fastcgi_params, jadi PHP tidak berfungsi dan tidak ada kesalahan di log.