Rumah >pembangunan bahagian belakang >masalah PHP >Bagaimana untuk menyelesaikan masalah ralat php 500

Bagaimana untuk menyelesaikan masalah ralat php 500

藏色散人
藏色散人asal
2021-12-29 09:30:2912601semak imbas

Penyelesaian kepada ralat php 500: 1. Semak skrip PHP dan ubah suainya;

Bagaimana untuk menyelesaikan masalah ralat php 500

Persekitaran pengendalian artikel ini: sistem Windows 7, PHP versi 7.1, komputer Dell G3.

Bagaimana untuk menyelesaikan masalah ralat php 500?

ralat PHP dan 500

Pulangan sering ditemui semasa PHP proses pembangunan 500 situasi ralat, dan tiada kandungan debugging (tersedia) dalam badan. Pada masa ini, anda perlu menyahpepijat secara perlahan-lahan (mata putus, menghidupkan mod penyahpepijatan, dsb.), tetapi jika ia adalah rangkaian langsung, ralat ini akan membuat orang gila Ia tidak mudah untuk memecahkan titik atau menghidupkan mod penyahpepijatan. Tetapi kerana ia adalah ralat, sentiasa ada penyelesaian Mari kita menganalisis punca dan penyelesaian 500 langkah demi langkah.

Ralat 0x01, 500

ralat 500, juga dipanggil Ralat Pelayan Dalaman (ralat perkhidmatan dalaman), bermakna perkhidmatan tidak dapat memproses permintaan disebabkan ralat yang tidak diketahui. Dalam laman web PHP, ia biasanya dikembalikan oleh PHP Dalam erti kata lain, 500 ralat biasanya ralat dalam skrip PHP.

Bagaimana untuk menyelesaikan masalah ralat php 500

paket tangkap php-fpm 500

Seperti yang dapat dilihat dari gambar di atas (seni bina Nginx PHP-FPM), kelas yang tidak wujud dipanggil dalam PHP Pada masa ini, ralat berlaku dalam skrip dan mengembalikan 500 kepada Nginx (dan mesej ralat juga dikembalikan, tetapi ia hanya dinyahpasang dalam STDERR).

0x02, pengecualian ralat manakah yang akan menyebabkan 500

Jadi apakah jenis ralat yang akan menyebabkan 500 ralat Semua peringkat ralat PHP boleh didapati dalam dokumentasi rasmi PHP (http : //php.net/manual/zh/errorfunc.constants.php), dan tahap ralat ialah E_ERROR, E_PARSE, E_RECOVERABLE_ERROR, E_USER_ERROR dan pengecualian yang tidak ditangkap, dsb. akan menyebabkan 500 ralat.

Bagaimana untuk menyelesaikan masalah ralat php 500

E_ERROR level ralat menyebabkan 500

0x03, dalam keadaan apa ralat tidak akan kembali 500

di atas Seperti yang dinyatakan, ini disebabkan oleh ralat dalam skrip PHP, tetapi adakah ralat atau pengecualian dalam skrip PHP pasti menghasilkan 500? Jelas sekali tidak, walaupun skrip mempunyai ralat yang membawa maut, ia masih boleh mengembalikan 200.

Bagaimana untuk menyelesaikan masalah ralat php 500

pilihan konfigurasi display_errors

Dalam aplikasi web berdasarkan python, nodejs, dsb., secara lalai, jika pengecualian berlaku, maklumat akan dicetak ke konsol ( STDERR/STDOUT). Dalam PHP berdasarkan seni bina PHP-FPM, tiada konsol untuk dicetak dan stderr dan stdoutnya ditetapkan kepada STRDERR dan STDOUT yang sepadan dalam FastCGI. Jika ralat diubah hala ke STDOUT, ralat akan dikeluarkan terus kepada respons dan kod status akan ditetapkan kepada 200. Ini juga merupakan keupayaan yang dicapai oleh pilihan display_errors.

Konfigurasi pilihan display_errors perlu dilaksanakan melalui ini_set Konfigurasi display_errors dalam dokumen PHP menunjukkan bahawa nilai adalah jenis rentetan Dalam penggunaan sebenar, nombor dan jenis Boolean juga boleh menghidupkan konfigurasi ini atau padam.

Bagaimana untuk menyelesaikan masalah ralat php 500

konfigurasi laporan_ralat

display_errors mengawal sama ada butiran ralat dipaparkan dan sama ada kod status ralat dikembalikan apabila ralat berlaku dalam skrip PHP dan error_reporting item digunakan untuk mengawal ralat Tahap yang boleh dicetak terus.

Item tetapan error_reporting boleh dikonfigurasikan melalui error_reporting(E_ALL) atau ini_set('error_reporting', E_ALL Untuk butiran parameter fungsi, sila rujuk dokumentasi PHP.

Perlu diingatkan bahawa PHP sendiri mempunyai log ralat (dua item konfigurasi error_log dan log_errors Jika ralat berlaku, PHP akan menulis ralat ke dalam log ralat, dan ralat mana yang perlu ditulis Ia dikawal). oleh item error_reporting.

Bagaimana untuk menyelesaikan masalah ralat php 500

Jangan paparkan butiran ralat apabila tahap ralat tidak sepadan

0x04, cara mengendalikan 500 secara munasabah pada rangkaian sedia ada

Kejadian ralat 500 menunjukkan bahawa skrip PHP tidak dapat dijalankan secara normal pada masa ini adalah untuk menangkap pengecualian dan merekodkannya dalam log untuk memudahkan penyahpepijatan dan pengendalian pepijat rangkaian langsung pada masa hadapan. .


PHP disertakan dengan log ralat

PHP sendiri sudah mempunyai rekod log ralat, anda boleh menetapkan log_errors dalam php.ini Tetapkan item kepada Hidup dan bekerjasama dengan item konfigurasi error_log untuk menentukan laluan penyimpanan log ralat.

Bagaimana untuk menyelesaikan masalah ralat php 500

Ralat suis pengelogan

Bagaimana untuk menyelesaikan masalah ralat php 500

Tetapan laluan log

Penulisan log ralat ini tidak terjejas oleh display_errors kawalan konfigurasi. Maksudnya, tidak kira sama ada display_errors dihidupkan atau tidak, ralat akan direkodkan dalam log. Walau bagaimanapun, ia dikawal oleh konfigurasi error_reporting Jika tahap ralat semasa tidak sepadan dengan tahap ralat dalam error_reporting, ralat tidak akan ditulis pada log. Iaitu, jika tahap ralat ialah E_ERROR, tetapi tetapan adalah error_reporting(E_NOTICE), maka mesej ralat E_ERROR tidak akan muncul dalam log.

Bagaimana untuk menyelesaikan masalah ralat php 500

Log ralat PHP merekodkan pelbagai jenis ralat

Bagaimana untuk menyelesaikan masalah ralat php 500

Log tidak ditulis kerana ketidakpadanan tahap ralat

Tangkap rekod pengecualian ralat

PHP menyediakan set_error_handler, register_shutdown_function, set_exception_handler, error_get_last dan fungsi pengendalian ralat lain yang berkaitan. Ralat rakaman boleh dicapai dengan menulis maklumat ralat yang ditangkap ke log yang ditentukan melalui fungsi. Untuk butiran tentang penggunaan fungsi

, sila rujuk http://km.oa.com/group/19368/articles/show/302491 Berikut ialah templat:

$previousHandler = set_exception_handler(function(Exception $ex) use (&$previousHandler) {
    call_user_func('exceptionHandler', $ex, $previousHandler);
});
set_error_handler('errorHandler');
register_shutdown_function('fatalErrorHandler');
function exceptionHandler(Exception $ex, $previousHandler)
{
    $info = array(
        $ex->getFile(),
        $ex->getLine(),
        $ex->getCode(),
        $ex->getMessage()
    );
    // 记录日志
    logPHPError($info);
    if (isset($previousHandler) && is_callable($previousHandler)) {
        call_user_func($previousHandler, $ex);
    }
}
/**
 * 框架错误处理函数
 * @param $errno
 * @param $errstr
 * @param $errfile
 * @param $errline
 * @return bool
 */
function errorHandler($errno = 0, $errstr = '', $errfile = '', $errline = 0)
{
    switch ($errno) {
        case E_WARNING:
            $errname = 'E_WARNING';
            break;
        case E_NOTICE:
            $errname = 'E_NOTICE';
            break;
        case E_STRICT:
            $errname = 'E_STRICT';
            break;
        case E_RECOVERABLE_ERROR:
            $errname = 'E_RECOVERABLE_ERROR';
            break;
        case E_DEPRECATED:
            $errname = 'E_DEPRECATED';
            break;
        case E_USER_ERROR:
            $errname = 'E_USER_ERROR';
            break;
        case E_USER_WARNING:
            $errname = 'E_USER_WARNING';
            break;
        case E_USER_NOTICE:
            $errname = 'E_USER_NOTICE';
            break;
        case E_USER_DEPRECATED:
            $errname = 'E_USER_DEPRECATED';
            break;
        default:
            restore_error_handler();
            return false;
    }
    // 记录日志
    $info = array(
        $errfile,
        $errline,
        $errname,
        $errstr
    );
    logPHPError($info);
    restore_error_handler();
    return false;
}
/**
 * Fatal error错误处理
 */
function fatalErrorHandler()
{
    if (($e = error_get_last()) && $e['type'] === E_ERROR) {
        $info = array(
            $e['file'],
            $e['line'],
            'E_ERROR',
            $e['message']
        );
        // 记录日志
        logPHPError($info);
    }
}

Ringkasan 0x05

Untuk meringkaskan, error_reporting ialah fungsi atau konfigurasi yang digunakan untuk mengawal tahap output maklumat ralat ke pelayar atau log ralat PHP, manakala display_errors mengawal sama ada untuk mengeluarkan ralat dan maklumat amaran kepada penyemak imbas.

Memandangkan log ralat PHP adalah global dan dikawal oleh error_reporting, adalah disyorkan untuk melaksanakan logik penangkapan dan rakaman ralat (pengecualian) anda sendiri dalam perniagaan anda.

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah ralat php 500. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn