Mengapakah debug_backtrace() kembali kosong?
P粉204136428
P粉204136428 2023-07-31 11:21:13
0
1
381

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?


P粉204136428
P粉204136428

membalas semua (1)
P粉291886842

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.

print_r(debug_backtrace());

Hasil yang dihasilkan ialah:

Array ( )

Jika anda meletakkan kod di dalam fungsi, anda akan mendapat timbunan panggilan yang mengandungi satu item:

function foo() { print_r(debug_backtrace()); } foo();

Hasil yang dihasilkan ialah:

Array ( [0] => Array ( [file] => ... [line] => 6 [function] => foo [args] => Array ( ) ) )

Jika anda ingin mendapatkan beberapa maklumat penyahpepijatan (minimum) dalam skop global, anda boleh membungkus semua kod dalam penutupan dan memanggilnya sebaris dengan segera:

(function() { // all your code here print_r(debug_backtrace()); })();

Hasilnya

Array ( [0] => Array ( [file] => ... [line] => 5 [function] => {closure} [args] => Array ( ) ) )

Berkenaan data sesi/persekitaran, ia hanya akan dipaparkan jika anda melepasinya sebagai parameter:

foo($_ENV);

Hasil:

Array ( [0] => Array ( [file] => ... [line] => 6 [function] => foo [args] => Array ( [0] => Array ( [TERM] => xterm [PATH] => /usr/bin:/bin [LANG] => C [SHELL] => /bin/sh [MAIL] => /var/mail/nobody [LOGNAME] => nobody [USER] => nobody [HOME] => /tmp ) ) ) )

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));
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!