Saya mempunyai sekeping kod PHP yang dijalankan pada PHP 7.4.
Sebahagian daripadanya ialah skrip PHP peringkat atas (/home/path/a.php), yang mengandungi satu siri blok cuba-tangkap dan termasuk objek dan pelbagai fail panggilan.
Blok tangkap cuba ini akan membuang pengecualian apabila menghadapi ralat pelanggan dan ralat masa jalan.
Dalam pernyataan lontaran, log ralat disertakan, termasuk debug_backtrace() yang dicetak pada log ralat.
// beberapa kod gunakan beberapa/laluan/ke/objek; $database = Pangkalan Data baharu(); sertakan "some/file/reference.php"; cuba { // pelbagai perkara termasuk data $_SESSION if (kosong($_SESSION['b']) || kosong($_POST['d'])) { if(kosong($_SESSION['b'])) { error_log("session nampak kosong. No b"); } if(kosong($_POST['d'])) { error_log("POST kelihatan kosong. Tiada d"); } buang RuntimeException baru('Pengesahan tidak betul/butiran borang diberikan.'); } } tangkapan (RuntimeException | Exception $ex) { error_log("Halaman Log Masuk: ".$_SESSION['message']); error_log("debug: ".print_r(debug_backtrace(),true)); }
Walau bagaimanapun, kod ini berjalan dan mengumpul ralat dengan betul, tetapi log ralat hanya menunjukkan ini:
[31-Jul-2023 18:42:17 Eropah/London] Beberapa mesej maklum balas tersuai daripada $_SESSION['message']
[31-Jul-2023 18:42:17 Eropah/London] Array
(
)
Mengapakah debug_backtrace() kosong di sini? Saya menjangkakan ia sekurang-kurangnya memaparkan parameter dan pembolehubah yang disediakan oleh halaman, atau data SESI atau data persekitaran.
Saya telah menggunakan kaedah ini di tempat lain dan (seingat saya) ia berfungsi dengan baik. Adakah saya terlepas sesuatu?
debug_backtrace()
Tindanan panggilan disediakan untuk menjejaki di mana anda berada, tetapi anda sudah berada dalam skop paling luar (iaitu global) dan belum membuat sebarang panggilan, jadi tiada tindanan panggilan tersedia.Hasil yang dihasilkan ialah:
Jika anda meletakkan kod di dalam fungsi, anda akan mendapat timbunan panggilan yang mengandungi satu item:
Hasil yang dihasilkan ialah:
Jika anda ingin mendapatkan beberapa maklumat penyahpepijatan (minimum) dalam skop global, anda boleh membungkus semua kod dalam penutupan dan memanggilnya sebaris dengan segera:
Hasilnya
Berkenaan data sesi/persekitaran, ia hanya akan dipaparkan jika anda melepasinya sebagai parameter:
Hasil:
Jika anda ingin log pembolehubah sesi/persekitaran seperti ini, cara terbaik mungkin adalah dengan mengeluarkannya secara eksplisit:
error_log(print_r($_ENV, true)); error_log(print_r($_SESSION, true));