Menu

Error Reporting PHP: Menampilkan Error dan E_ALL

Untuk menampilkan semua error PHP, taruh ini_set('display_errors', '1'); dan error_reporting(E_ALL); di bagian atas script, atau atur display_errors = On dan error_reporting = E_ALL di php.ini. Di production, catat error ke log alih-alih menampilkannya.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Untuk menampilkan error PHP, taruh baris-baris ini di bagian atas script-mu: ini_set('display_errors', '1'); dan error_reporting(E_ALL);. Yang pertama membuat PHP mencetak pesan error, yang kedua membuatnya melaporkan setiap jenis error, termasuk warning dan deprecation.

<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

Dengan itu, kesalahan seperti membaca variabel yang tidak pernah diisi akan mencetak pesan lengkap dengan file dan nomor barisnya, alih-alih gagal diam-diam:

Warning: Undefined variable $total in /home/index.php on line 7

error_reporting() yang dipanggil tanpa argumen mengembalikan pengaturan saat ini sebagai angka. Tekan Jalankan untuk mengatur sebuah level lalu menerjemahkannya kembali menjadi nama-nama:

Setiap jenis error adalah satu bit, jadi E_ALL & ~E_DEPRECATED berarti "semuanya kecuali deprecation". Ganti baris pertama menjadi error_reporting(E_ERROR | E_WARNING); lalu jalankan lagi.

Menampilkan error lewat php.ini

Pengaturan di dalam script baru berlaku setelah script mulai berjalan. Untuk menampilkan error di setiap script, termasuk parse error, ubah php.ini (temukan dengan php --ini):

; Development
display_errors = On
display_startup_errors = On
error_reporting = E_ALL

Restart Apache atau PHP-FPM setelah mengedit. Server bawaan php -S dan command line membaca file itu setiap kali dijalankan. Di shared hosting tanpa akses ke php.ini, Apache dengan mod_php juga menerima baris di .htaccess:

php_flag display_errors on
php_value error_reporting -1

-1 mengaktifkan setiap bit, sama dengan E_ALL.

Level-level error

KonstantaPemicunyaMenghentikan script
E_ERRORFatal error saat runtime, misalnya kehabisan memoriya
E_PARSEKesalahan sintaks di fileya
E_WARNINGVariabel atau key array yang belum didefinisikan, file yang tidak ada di includetidak
E_NOTICEMasalah kecil (hanya sedikit yang tersisa di PHP 8)tidak
E_DEPRECATEDKode yang akan ditolak oleh versi PHP mendatangtidak
E_USER_*Error yang kamu munculkan dengan trigger_error()hanya E_USER_ERROR
E_ALLSetiap level, termasuk error core dan kompilasi yang tidak tercantum di sini

PHP 8.0 mengubah banyak warning lama menjadi exception: membagi dengan nol memakai / dan memberikan tipe yang salah ke fungsi bawaan sekarang melempar subclass Error, sama seperti memanggil fungsi yang tidak didefinisikan sejak PHP 7. Kamu bisa menangkap ketiganya:

Exception dibahas di try dan catch. Warning, notice, dan deprecation tetap melewati sistem error reporting yang dijelaskan di sini.

Mencatat error ke log alih-alih menampilkannya

Di situs yang sudah live, pengunjung tidak boleh melihat pesan error: pesan itu membocorkan path, SQL, dan kode. Tulis ke file log sebagai gantinya:

; Production
display_errors = Off
log_errors = On
error_log = /var/log/php/app-errors.log
error_reporting = E_ALL

Tetap gunakan error_reporting = E_ALL di production. Menurunkannya tidak membuat error hilang, hanya membuatmu tidak tahu kalau error itu terjadi. Pesanmu sendiri bisa masuk ke log yang sama dengan error_log():

<?php
error_log("Payment failed for order 1042");

Lalu pantau file-nya selama kamu menguji: tail -f /var/log/php/app-errors.log.

Mengubah warning menjadi exception dengan set_error_handler

set_error_handler mengganti cara bawaan PHP menangani warning, notice, dan deprecation dengan fungsi buatanmu sendiri. Pola yang umum adalah mengubah setiap error menjadi ErrorException, jadi key array yang terlupa akan menghentikan kode seperti exception lainnya dan bisa ditangkap:

Handler menerima level error sebagai argumen pertamanya, jadi ia bisa memperlakukan setiap level secara berbeda. Handler yang ini hanya mencatat deprecation ke log dan mengubah sisanya menjadi exception:

Fatal error dan parse error tidak pernah sampai ke handler, karena script tidak bisa berlanjut setelahnya. Untuk mencatatnya, daftarkan sebuah shutdown function yang membaca error_get_last().

Membaca error terakhir dengan error_get_last

Beberapa fungsi mengembalikan false dan hanya melaporkan alasannya sebagai warning, misalnya file_get_contents pada file yang tidak ada. error_get_last() mengembalikan warning itu sebagai array, yang berguna saat kamu ingin menampilkan pesanmu sendiri:

Operator @ di depan panggilan itu menyembunyikan pesan untuk ekspresi tersebut saja. Pakai seperlunya dan hanya saat kamu langsung memeriksa hasilnya sesudahnya, seperti di sini; @ yang berdiri sendiri hanya menyembunyikan bug.

Kesalahan umum: error sudah diaktifkan, tetapi halamannya tetap kosong

Kalau kamu sudah menambahkan ini_set('display_errors', '1') dan masih melihat halaman putih, kemungkinan besar error-nya adalah parse error. PHP mem-parse seluruh file sebelum menjalankan baris pertama, jadi ; atau } yang hilang menghentikan semuanya sebelum ini_set berjalan. Periksa file-nya dari terminal, yang selalu mencetak pesannya:

php -l index.php
Errors parsing index.php
PHP Parse error:  syntax error, unexpected token "," in index.php on line 2

Nomor baris menunjuk ke tempat PHP menyerah, yang sering kali baris setelah kesalahan sebenarnya. Perbaiki, jalankan php -l lagi sampai muncul No syntax errors detected, lalu muat ulang halamannya.

Pertanyaan yang sering diajukan

Bagaimana cara menampilkan semua error di PHP?

Tambahkan ini_set('display_errors', '1'); ini_set('display_startup_errors', '1'); error_reporting(E_ALL); di bagian paling atas script, atau atur display_errors = On dan error_reporting = E_ALL di php.ini lalu restart web server atau PHP-FPM.

Kenapa halaman PHP saya hanya menampilkan layar putih kosong?

Sebuah fatal error menghentikan script saat display_errors mati, jadi tidak ada yang tercetak. Aktifkan tampilan error (atau baca log error-nya, misalnya dengan tail -f pada file yang ditunjuk error_log) untuk melihat pesan dan nomor barisnya.

Kenapa ini_set('display_errors', 1) tidak menampilkan parse error saya?

Parse error menghentikan PHP sebelum satu baris pun dari file itu berjalan, jadi panggilan ini_set tidak pernah terjadi. Atur display_errors di php.ini, atau taruh ini_set di file kecil yang lalu melakukan include terhadap file yang rusak.

Apakah display_errors sebaiknya aktif di production?

Tidak. Pesan error membocorkan path file dan detail kode ke pengunjung. Di production, pakai display_errors = Off, log_errors = On, dan path error_log, serta tetap gunakan error_reporting = E_ALL supaya masalah tetap tercatat.

Apa fungsi error_reporting(0)?

Fungsi ini mematikan pelaporan semua jenis error untuk sisa script, jadi warning bahkan fatal error tidak menghasilkan pesan apa pun. Cara ini menyembunyikan masalah, bukan memperbaikinya; lebih baik catat error ke log daripada membungkamnya.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai