Bagaimana saya bisa mendapatkan pesan kesalahan yang berguna di PHP?
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
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_reporting
dan display_errors
. display_errors
mungkin 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_reporting
mendapatkan 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/
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
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.
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.
Kesalahan dan peringatan biasanya muncul di ....\logs\php_error.log
atau ....\logs\apache_error.log
tergantung 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.
Konfigurasi PHP
2 entri di php.ini mendikte output kesalahan:
- display_errors
- error_reporting
Dalam produksi , display_errors
biasanya 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_ALL
ke 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.
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
Ada ekstensi yang sangat berguna yang disebut " xdebug " yang akan membuat laporan Anda jauh lebih bagus juga.
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.ini
dan 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
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.
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.
Di bagian atas halaman, pilih parameter
error_reporting(E_ERROR | E_WARNING | E_PARSE);
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_errors
konfigurasi PHP selama runtime, (ini termasuk apa saja mulai dari penggunaan ini_set
dalam 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_errors
aktif dan error_reporting
disetel -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.ini
file yang Anda muat atau file Anda apache.conf
atau httpd.conf
atau 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 = 1
dan error_reporting = -1
dalam 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_errors
dimatikan.
Banyak orang (dan instalasi stok PHP) akan menggunakan file ini produksi yang telah display_errors
dimatikan 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.
Untuk mempertahankan ini dan membuatnya nyaman, Anda dapat mengedit file php.ini Anda. Biasanya disimpan di /etc/php.ini
atau /etc/php/php.ini
, tetapi lebih banyak lokal php.ini
mungkin menimpanya, tergantung pada pedoman penyiapan penyedia hosting Anda. Periksa phpinfo()
file Loaded Configuration File
di 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
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>");
}
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 .
Saya merekomendasikan Nette Tracy untuk visualisasi kesalahan dan pengecualian yang lebih baik di PHP:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
error_reporting(E_ALL | E_STRICT);
Dan aktifkan kesalahan tampilan di php.ini
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');
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;
}
FirePHP juga bisa berguna.
buka php.ini Anda, pastikan sudah disetel ke:
display_errors = On
restart server Anda.
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.
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.log
untuk apache2 yang mencatat semua kesalahan.
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.
"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.
Anda dapat mengaktifkan pelaporan kesalahan lengkap (termasuk pemberitahuan dan pesan ketat). Beberapa orang menganggap ini terlalu bertele-tele, tetapi patut dicoba. Setel error_reporting
ke E_ALL | E_STRICT
dalam 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_errors
diaktifkan 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"
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
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.