Bagaimana saya bisa mendapatkan pesan kesalahan yang berguna di PHP?

583

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

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

Apakah ada cara untuk mendapatkan PHP untuk menghasilkan pesan kesalahan yang bermanfaat, seperti Java?

Candidasa
sumber
2
Juga lihat stackoverflow.com/q/1475297/632951
Pacerier
4
@UannStrauss, Itu meremehkannya. Dan ketika Anda akhirnya melihat kesalahan, katanya T_PAAMAYIM_NEKUDOTAYIM. Atau mungkin "harus merupakan instance dari integer, integer diberikan" .
Pacerier
1
Tutorial tentang ini: code2real.blogspot.com/2015/06/...
Murid

Jawaban:

498

Untuk kesalahan sintaks, Anda harus mengaktifkan tampilan kesalahan di php.ini. Secara default ini dimatikan 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 kesalahan sintaksis:

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

(3) Pilihan lain adalah menggunakan editor yang memeriksa kesalahan saat Anda mengetik, seperti PhpEd . PhpEd juga dilengkapi dengan debugger yang dapat memberikan informasi lebih rinci. (The 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/

Darryl Hein
sumber
25
2039 adalah nilai E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE. Lihat docs.php.net/manual/en/errorfunc.constants.php
Gumbo
Saya suka opsi file .htaccess. Ini membantu saya men-debug di area yang bukan bagian dari situs web publik. Terima kasih banyak atas tip ini!
jacekn
1
Saya akan menambahkan bahwa kesalahan logging ke file (dan mencari di sana) adalah solusi terbaik. Jangan mengandalkan menampilkan kesalahan pada halaman - mereka dapat merusaknya, Anda bisa lupa untuk mengubah pelaporan kesalahan untuk situs produksi dan ini akan menyebabkan Anda kesulitan di masa depan
Ivan Yarych
455

Berikut ini memungkinkan semua kesalahan:

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

Lihat juga tautan berikut

Eljakim
sumber
28
Terbaik untuk membuat perubahan ini di tingkat file .ini. Menghidupkan pelaporan kesalahan dari dalam skrip tidak berguna, karena tidak akan membantu dengan kesalahan sintaks atau kesalahan fatal lainnya yang mematikan fase kompilasi. Script terbunuh jauh sebelum mulai dijalankan dan mencapai penggantian pelaporan.
Marc B
Anda memang benar. Saya tidak melihat bahwa langkah itu ke server Anda sendiri.
Eljakim
6
Jalankan phpinfo () untuk menemukan file php.ini yang benar. Cari baris File Konfigurasi yang Dimuat .
Borrible
1
Jika Anda mencari kesalahan yang terjadi selama fase kompilasi, periksa log apache Anda yang sering berada di /var/log/apache2/error.log
csi
1
Jawaban ini akan gagal pada php7 ketika pengetikan ketat diaktifkan, karena parameter kedua ini_setadalah string.
PeeHaa
175

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 memiliki kesalahan dalam penangan shutdown. Saya menyalin dan menempelkan ini dari cms saya sendiri tanpa mengujinya, tetapi saya yakin itu berhasil.

m4dm4x1337
sumber
4
Saya mendapatkan halaman kosong dari kode itu. Apa yang Anda maksud dengan "Anda memiliki kesalahan dalam penangan shutdown" dan apa yang harus saya lakukan untuk menyelesaikan masalah?
Paolo M
@ PaoloM, Dia mengatakan kesalahan dalam fungsi di ShutdownHandleratas. Pada dasarnya ini adalah hack sementara menggantikan penanganan kesalahan yang tepat.
Pacerier
Terima kasih, bermanfaat, tetapi bagaimana saya bisa menonaktifkan E_NOTICEkesalahan pada fungsi ini?
MajAfy
Ini adalah solusi yang tepat, tapi hati-hati dengan pengungkapan informasi ketika kesalahan terjadi ... (lebih suka pencatatan daripada gema ke pengguna)
Sam Jason Braddock
1
Saya menggunakan ini ketika Symfony tidak dapat menangkap kesalahan fatal yang benar.
COil
61

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

Juga kesalahan yang bermanfaat sering diarahkan ke browser, tetapi karena mereka tidak valid html mereka tidak ditampilkan.

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

James Anderson
sumber
13
Sayangnya, sumber halaman tampilan tidak menampilkan apa-apa juga.
Matthew Scharley
2
Kesalahan Parse harus terlihat di log kesalahan Apache, terlepas dari pengaturan apa yang Anda miliki di tempat lain. Jika Anda tidak memiliki kontrol atas server maka mendapatkan log kesalahan apache mungkin sulit, tetapi saya sarankan Anda berbicara dengan penyedia Anda dan ada cara untuk mengekspos log kesalahan kepada Anda. Selain itu, saya hanya dapat menyarankan apa yang dimiliki orang lain - periksa kode Anda untuk kesalahan parsing di server pengembangan lokal Anda sebelum Anda menyebar ke produksi. Juga, IDE yang memvalidasi seperti Eclipse's PDT mungkin sangat membantu.
Guss
5
Kembali ke ini, saya baru-baru ini memiliki masalah stack overflow yang tidak menghasilkan kesalahan, bahkan dalam log dan tidak memanifestasikannya sampai saya menginstal xdebug ke server. Gah.
Matthew Scharley
Jika Anda tidak dapat memodifikasi php.ini, buat file .htaccess dengan php_flag display_errors 1di dalamnya.
Tom
59

Anda dapat memasukkan 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.

Tomalak
sumber
2
Itu benar. Dalam hal ini nilai-nilai harus ditetapkan dalam inisial secara langsung - untuk lingkungan pengembangan murni ini mungkin lebih disukai.
Tomalak
53

Konfigurasi PHP

2 entri dalam php.ini menentukan output kesalahan:

  1. display_errors
  2. error_reporting

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

Namun, dalam pengembangan , itu harus diatur ke On, sehingga kesalahan 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_ALLuntuk menampilkan semua kesalahan. Periksa !

Whoa whoa! Tanpa cek! Saya tidak dapat mengubah php.ini saya!

Itu memalukan. Biasanya host bersama tidak memungkinkan 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 di runtime! Artinya, itu akan berjalan ketika skrip berjalan! Manis!

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

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

Saya masih mendapatkan kesalahan halaman / 500 kosong!

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

Dengan kesalahan sintaks, skrip bahkan tidak bisa runtime. Gagal pada waktu kompilasi , artinya akan menggunakan nilai-nilai di php.ini, yang jika Anda tidak berubah, mungkin tidak mengizinkan tampilan kesalahan.

Log kesalahan

Selain itu, PHP secara default kesalahan log. Di hosting bersama, mungkin dalam folder khusus atau folder yang sama dengan skrip yang menyinggung.

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

Hantu Madara
sumber
30

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

gnarf
sumber
2
Memang, ini adalah alat debugging yang sangat berguna — membuat pesan kesalahan jauh lebih jelas, dengan jejak tumpukan penuh dan dump variabel dan semuanya.
hbw
2
Iya. Dan kemudian gunakan sesuatu seperti plugin VimDebugger untuk menelusuri kode Anda dan mencari tahu kesalahannya.
Sander Marechal
1
NetBeans dengan xdebug di sini. Sangat mengagumkan. Saya baru mengenal PHP (biasanya ASP.NET) dan telah mengeluarkan pernyataan gema sebelumnya.
Some Canuck
30

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

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off
FDisk
sumber
3
Maaf, tetapi -1 karena tidak membaca jawaban lain yang sudah diposting. Ini diurus dalam .htaccess sebagaimana telah disebutkan beberapa kali.
Matthew Scharley
12
"hosting gratis" biasanya mengabaikan .htaccess
FDisk
27

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

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

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

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

Hal-hal selanjutnya yang perlu dipertimbangkan:

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

Lihat juga:

hakre
sumber
27

Dimungkinkan untuk mendaftarkan kait 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.

Eduardo Oliveira
sumber
1
Ini adalah emas murni untuk orang-orang yang terjebak di hosting yang tidak menunjukkan kesalahan tetapi memungkinkan akses nol log
Rafael Mena Barreto
18

Ini adalah masalah konfigurasi yang dimuat vs. runtime

Sangat penting untuk mengenali bahwa kesalahan sintaksis atau kesalahan parse terjadi selama langkah kompilasi atau parsing , yang berarti bahwa PHP akan menjamin sebelum bahkan memiliki kesempatan untuk mengeksekusi kode Anda. Jadi jika Anda memodifikasi display_errorskonfigurasi PHP selama runtime, (ini termasuk apa pun dari menggunakan ini_setdalam kode Anda untuk menggunakan .htaccess, yang merupakan file konfigurasi runtime) maka hanya pengaturan konfigurasi yang dimuat standar sedang bermain.

Cara selalu menghindari WSOD dalam pembangunan

Untuk menghindari WSOD Anda ingin memastikan bahwa file konfigurasi yang dimuat telah display_errorsdiaktifkan dan error_reportingdiatur ke -1( ini adalah E_ALL yang setara karena memastikan semua bit dihidupkan terlepas dari versi PHP yang Anda jalankan ). Jangan hardcode nilai konstan E_ALL, karena nilai itu dapat berubah antara versi PHP yang berbeda.

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

Cara menemukan file konfigurasi (php.ini) Anda dimuat

Untuk mencari file konfigurasi yang dimuat Anda, cukup buat file PHP baru hanya dengan kode berikut ...

<?php
phpinfo();

Lalu arahkan browser Anda di sana dan lihat File Konfigurasi yang Dimuat dan file .ini tambahan yang diuraikan , yang biasanya di bagian atas Anda phpinfo()dan akan menyertakan jalur absolut ke semua file konfigurasi yang dimuat.

Jika Anda melihat (none)alih-alih file, itu berarti Anda tidak memiliki php.ini di Path 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 me-restart httpd atau php-fpm untuk memuatnya. Ingat, ini adalah file php.ini pengembangan yang dibundel dengan sumber PHP. Jadi tolong jangan menggunakannya dalam produksi!


Hanya saja, jangan lakukan ini dalam produksi

Ini benar-benar adalah cara terbaik untuk menghindari WSOD dalam pembangunan. Siapa pun yang menyarankan Anda meletakkan ini_set('display_errors', 1);atau error_reporting(E_ALL);di bagian atas skrip PHP atau menggunakan. telah display_errorsdimatikan.

Banyak orang (dan instalasi stok PHP) akan menggunakan file production-in yang telah display_errorsdimatikan secara default, yang biasanya menghasilkan frustrasi yang sama seperti yang Anda alami di sini. Karena PHP sudah mematikannya ketika mulai, kemudian menemui kesalahan sintaks atau parse, dan menebus dengan tidak ada output. 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 menguraikan kode Anda karena tidak akan pernah mencapai runtime.

Sherif
sumber
17

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 ketika Anda menjalankan secara lokal. Ini juga memberi Anda variabel test_server untuk digunakan di tempat lain yang sesuai.

Kesalahan apa pun yang terjadi sebelum skrip berjalan tidak akan ditangkap, tetapi untuk 99% kesalahan yang saya buat, itu bukan masalah.

Bradshaw yang kaya
sumber
2
Jika Anda membedakan antara lingkungan lokal dan produksi, Anda harus mengaktifkan atau menonaktifkan kesalahan secara global (di php.ini Anda) dan tidak dalam kode yang juga bisa menjadi kode produksi. Jika Anda perlu men-debug situs web produksi di lingkungan produksinya dan hanya ingin Anda dapat melihat kesalahan, gunakan $_SERVER['REMOTE_HOST']untuk memeriksa apakah kliennya, yah, Anda.
Jaap Haagmans
17

Di bagian atas halaman pilih parameter

error_reporting(E_ERROR | E_WARNING | E_PARSE);
Kld
sumber
16

Untuk bertahan dan membuatnya confortale, 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 pengaturan penyedia hosting Anda. Periksa phpinfo()file Loaded Configuration Filedi bagian atas, untuk memastikan file mana yang terakhir dimuat.

Cari display_errors dalam file itu. Seharusnya hanya ada 3 contoh, 2 diantaranya dikomentari.

Ubah baris yang tidak dicommentasikan ke:

display_errors = stdout
Ram
sumber
16

Entah apakah itu akan membantu, tapi di sini ada sepotong 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 yang menghilang, jadi mungkin sesuatu di sini akan memberi Anda ide.

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>");
}
Eli
sumber
@ El, Ini memiliki overhead runtime, per permintaan halaman .
Pacerier
up 1 untuk konsep yang mengabaikan pengaturan debug namun server dikonfigurasikan, baik saat Anda menggunakan atau memelihara (sedang dikembangkan)
justnajm
15
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

Selain itu, Anda bisa mendapatkan informasi lebih rinci dengan xdebug .

Yan.Zero
sumber
Xdebug dapat diaktifkan dari php.ini
jewelhuq
15

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

Tangkapan layar Nette Tracy

Ondřej Šotek
sumber
3
Tracy memperhatikan pengaturan yang tepat dari semua kesalahan tampilan dan opsi pelaporan kesalahan untuk memberikan output dalam situasi seperti yang dijelaskan dalam posting asli ... Jadi alat ini sangat membantu untuk mengatasi penanya "Adakah yang bisa merekomendasikan tips, alat dan teknik debugging PHP yang baik? ".
Jan Drábek
15
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Abuzer Firdousi
sumber
10
error_reporting(E_ALL | E_STRICT);

Dan nyalakan kesalahan tampilan di php.ini

Ólafur Waage
sumber
9

Anda dapat mendaftarkan penangan kesalahan Anda sendiri di PHP. Misalnya, membuang semua kesalahan ke file dapat membantu Anda dalam kasus-kasus yang tidak jelas ini. Perhatikan bahwa fungsi Anda akan dipanggil, apa pun error_reporting Anda saat ini diatur. 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');
soulmerge
sumber
7

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

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

Seperti yang ditunjukkan oleh kontributor lain, ini dinonaktifkan secara default karena alasan keamanan. Sebagai tip yang berguna - ketika Anda mengatur situs Anda, sangat mudah untuk melakukan pergantian 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;
}
Sintesis Kode
sumber
6

FirePHP dapat bermanfaat juga.

Bradshaw yang kaya
sumber
Saya harus mencatat FirePHP adalah proyek mati karena FireBug diintegrasikan ke dalam Konsol Firefox. ChromePHP agaknya adalah penerus di sana, tetapi tidak sepenuhnya.
Machavity
6

buka php.ini Anda, pastikan sudah disetel ke:

display_errors = On

restart server Anda.

pengguna577803
sumber
6

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

pengguna1681048
sumber
6

jika Anda adalah pengguna ubuntu maka goto terminal Anda dan jalankan perintah ini

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

di mana ia akan menampilkan 50 kesalahan terbaru. Ada file kesalahan error.loguntuk apache2 yang mencatat semua kesalahan.

Ashutosh Jha
sumber
5

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

error_reporting(E_ALL);

Ini bahkan menyebabkan peringatan minimal muncul. Dan, untuk berjaga-jaga:

ini_set('display_errors', '1');

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

Daniel Sorichetti
sumber
Seperti halnya jawaban Tomalak, ini tidak berfungsi untuk kesalahan sintaksis.
Darryl Hein
5

"KESALAHAN" 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 mengapa pengembang dan di mana potongan kode mereka mendapatkan kesalahan, sehingga dengan mengetahui kesalahan-kesalahan tersebut, pengembang dapat membuat kode mereka lebih baik dalam banyak cara.

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.

Janyk
sumber
4

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

error_reporting = E_ALL | E_STRICT

E_STRICT akan memberi tahu Anda tentang fungsi yang sudah 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 membantu, cobalah mengecualikan pemberitahuan:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Pastikan display_errorsjuga diaktifkan di php.ini. Jika versi PHP Anda lebih lama dari 5.2.4, atur ke On:

display_errors = "On"

Jika versi Anda 5.2.4 atau lebih baru, gunakan:

display_errors = "stderr"
Ayman Hourieh
sumber
4

Selain dari error_reporting dan pengaturan display_errors ini, Anda bisa mendapatkan kesalahan SYNTAX dari file log server web Anda. Ketika saya sedang 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 sintaksis. 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
jmucchiello
sumber
3

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

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

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

AVKurov
sumber
Saya memiliki masalah yang sama dan itu karena file konfigurasi default Nginx hilang baris itu.
Salem