ฉันจะรับข้อผิดพลาดของ PHP ที่จะแสดงได้อย่างไร


1731

ผมได้ตรวจสอบไฟล์ INI ของฉัน PHP ( php.ini) และมีการตั้งค่าและการรายงานข้อผิดพลาดคือdisplay_errors E_ALLฉันรีสตาร์ทเว็บเซิร์ฟเวอร์ Apache ของฉันแล้ว

ฉันวางบรรทัดเหล่านี้ไว้ที่ด้านบนสุดของสคริปต์แล้วและมันก็ไม่ได้เกิดข้อผิดพลาดในการแยกวิเคราะห์แบบง่ายๆ ตัวอย่างเช่นผมประกาศตัวแปรด้วยและฉันจะไม่ปิดงบ"$" ";"แต่สคริปต์ของฉันทั้งหมดแสดงหน้าเปล่าเกี่ยวกับข้อผิดพลาดเหล่านี้ แต่ฉันต้องการเห็นข้อผิดพลาดจริง ๆในผลลัพธ์ของเบราว์เซอร์

error_reporting(E_ALL);
ini_set('display_errors', 1);

สิ่งที่ต้องทำคืออะไร?


8
ฉันยังไม่ได้สรุปว่าทำไมบางครั้งถึงไม่ได้ผล แต่สำหรับทุกคนที่ต้องการสลับข้อผิดพลาดอย่างรวดเร็วในสคริปต์ PHP (หรือเปิดใช้งานพวกเขาผ่าน$_REQUESTพารามิเตอร์) ทั้งสองบรรทัดนี้จะทำงานได้เกือบตลอดเวลา
brandonscript

คุณสามารถดูรายละเอียดของข้อผิดพลาดได้โดยเปิดใช้งาน xdebug จากไฟล์ php ini
jewelhuq

นี่คือบทความฉบับย่อซึ่งครอบคลุมหัวข้อ - blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

คำตอบ:


3200

สิ่งนี้ใช้ได้สำหรับฉันเสมอ:

ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

อย่างไรก็ตามสิ่งนี้ไม่ได้ทำให้ PHP แสดงข้อผิดพลาดในการแยกวิเคราะห์ - วิธีเดียวที่จะแสดงข้อผิดพลาดเหล่านั้นคือการแก้ไข php.ini ด้วยบรรทัดนี้:

display_errors = on

(หากคุณไม่สามารถเข้าถึงได้php.iniดังนั้นการวางสายนี้.htaccessอาจทำงานได้เช่นกัน):

php_flag display_errors 1

9
โปรดทราบว่าคุณสามารถใช้ 3 บรรทัดเหล่านี้แล้วรวม ('fileImWorkingOn.php'); จากนั้นคุณสามารถตรวจจับข้อผิดพลาดทางไวยากรณ์ได้เช่นกัน!
Snap

14
ในขณะที่ฉันไม่ใช่ SysOps ฉันคิดว่ามีคนจำนวนมากที่มีไฟล์. htaccess มากกว่า php.ini และสิ่งเหล่านี้จะมาก่อนการแยกวิเคราะห์ใช่ไหม php_flag display_errors 1สำหรับ. htaccess
Ryan Taylor

1
ดังนั้นตอนนี้ข้อผิดพลาดเข้าสู่ระบบพวกเขาจะไปที่ไหน ฉันไปที่ / var / log / apache2 และจะแสดงบันทึกทั้งหมด แต่ไม่มีข้อมูลเกี่ยวกับโปรแกรมที่ฉันเพิ่งรัน ฉันได้รับข้อมูลเกี่ยวกับการรีสตาร์ทระบบทุกเช้า
Michael

1
@Michael ข้อผิดพลาดไปทางขวาไปที่หน้าจอหรือไปที่ผลลัพธ์ถูกเปลี่ยนเส้นทางไปยัง
John แฟนซี

2
E_ALLไม่เพียงพอที่จะแสดงข้อผิดพลาดทั้งหมดใน PHP 5.3 " E_STRICTกลายเป็นส่วนหนึ่งE_ALLใน 5.4.0" - คู่มือ PHPคุณต้องการE_ALL | E_STRICTหรือ-1ในเวอร์ชั่นนั้น
เจอราร์ดโรช

155

คุณไม่สามารถตรวจจับข้อผิดพลาดในการแยกวิเคราะห์เมื่อเปิดใช้งานข้อผิดพลาดที่รันไทม์เพราะมันจะแยกวิเคราะห์ไฟล์ก่อนที่จะดำเนินการอะไรจริง ๆ (และเนื่องจากพบข้อผิดพลาดในระหว่างนี้มันจะไม่ดำเนินการใด ๆ ) คุณจะต้องเปลี่ยนการกำหนดค่าเซิร์ฟเวอร์จริงเพื่อให้ display_errors เปิดอยู่และใช้ระดับข้อผิดพลาดที่น่าตกใจ หากคุณไม่มีสิทธิ์เข้าถึง php.ini คุณอาจใช้. htaccess หรือคล้ายกันขึ้นอยู่กับเซิร์ฟเวอร์

คำถามนี้อาจให้ข้อมูลเพิ่มเติม


2
ไม่ทราบว่า ฉันแก้ไขไฟล์ php.ini ด้วยตนเองและทำงานได้ในขณะนี้ ขอบคุณ!
Abs

143

ภายในphp.iniของคุณ:

display_errors = on

จากนั้นรีสตาร์ทเว็บเซิร์ฟเวอร์ของคุณ


7
+ ① ใน Ubuntu /etc/php5/apache2/php.ini ของฉัน
m93a

5
สำหรับการรีสตาร์ท (Debian, Ubuntu, ฯลฯ )sudo service apache2 restart
Peter Krauss

4
สำหรับการเริ่มต้นใหม่ใน OS sudo apachectl -k restartX
ถั่ว

3
ข้อเท็จจริงที่น่าสนุก: คุณสามารถค้นหาไฟล์ php.ini ที่โหลดถ้าคุณใส่ phpinfo (); เป็นไฟล์ php เปล่า เป็นแถวที่ 7 และเรียกว่าLoaded Configuration File
Frankenmint

เราจะทำอย่างไรถ้าเรากำลังเขียนโค้ด php direclty บน cPanel?
arqam

98

ในการแสดงข้อผิดพลาดทั้งหมดที่คุณต้องมี:

1. มีบรรทัดเหล่านี้ในสคริปต์ PHP ที่คุณโทรจากเบราว์เซอร์ (โดยทั่วไปindex.php):

error_reporting(E_ALL);
ini_set('display_errors', '1');

2. (a) ตรวจสอบให้แน่ใจว่าสคริปต์นี้ไม่มีข้อผิดพลาดทางไวยากรณ์

-หรือ-

2. (b) ตั้งdisplay_errors = Onไว้ในphp.ini

มิฉะนั้นจะไม่สามารถเรียกใช้ 2 บรรทัดเหล่านั้นได้!

คุณสามารถตรวจสอบข้อผิดพลาดทางไวยากรณ์ในสคริปต์ของคุณโดยเรียกใช้ (ที่บรรทัดคำสั่ง):

php -l index.php

หากคุณรวมสคริปต์จากสคริปต์ PHP อื่นสคริปต์จะแสดงข้อผิดพลาดทางไวยากรณ์ในสคริปต์ที่รวมไว้ ตัวอย่างเช่น:

index.php

error_reporting(E_ALL);
ini_set('display_errors', '1');

// Any syntax errors here will result in a blank screen in the browser

include 'my_script.php';

my_script.php

adjfkj // This syntax error will be displayed in the browser

51

ผู้ให้บริการเว็บโฮสติ้งบางรายอนุญาตให้คุณเปลี่ยนพารามิเตอร์ PHP ใน.htaccessไฟล์

คุณสามารถเพิ่มบรรทัดต่อไปนี้:

php_value display_errors 1

ฉันมีปัญหาเช่นเดียวกับคุณและวิธีนี้แก้ไขได้


และถ้าคุณอยู่ในสภาพแวดล้อม nginx ให้เพิ่มค่า php ลงในไซต์ของคุณ (ใช้ได้กับไซต์) ภายใต้คำสั่ง location ~ \ .php fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis

40

คุณอาจพบว่าการตั้งค่าทั้งหมดสำหรับ "การรายงานข้อผิดพลาด" หรือ "ข้อผิดพลาดในการแสดงผล" ไม่ทำงานใน PHP 7 นั่นเป็นเพราะการจัดการข้อผิดพลาดได้เปลี่ยนไป ลองใช้สิ่งนี้แทน:

try{
     // Your code
} 
catch(Error $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

หรือเพื่อตรวจจับข้อยกเว้นและข้อผิดพลาดในครั้งเดียว (ซึ่งไม่สามารถใช้กับ PHP 5 ได้ย้อนหลัง):

try{
     // Your code
} 
catch(Throwable $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

1
คุณหมายถึง PHP7 หรือ PHP7.1 หรือไม่ ฉันสับสนฉันพยายามเป็นคำตอบที่ผ่านการตรวจสอบแล้วและฉันคิดว่าคุณกำลังเสนออะไรบางอย่างที่แตกต่างออกไปจาก IMHO แน่นอนว่า "ไม่มีความเข้ากันได้แบบย้อนหลัง" และถ้าคุณต้องแก้ไข PHP เต็ม <7 รหัสและต้องเพิ่มtry{} catch() {}รหัสทุกที่ ในรหัส php ที่กำหนดไว้แล้วของคุณฉันไม่ต้องการที่จะคิดว่าเป็นระเบียบที่จะ ..
vdegenne

@FancyJohn $bt = debug_backtrace(); print_r($bt);นี้อาจช่วยได้:
Frank Forte

@ballangddang ผมวิ่งเข้าไปในปัญหากับ PHP 7.0 ซึ่งวิธีเดียวที่ฉันจะได้รับข้อผิดพลาดในการแสดงผลที่ถูกใช้ลอง / Errorจับบล็อกและโดยเฉพาะการจับ หากคุณเขียนคำขอทั้งหมดใหม่ (ยกเว้นอาจเป็น JavaScript, CSS, รูปภาพ, ฯลฯ ) ไปยังไฟล์ index.php จากนั้นลองบล็อก catch catch ที่นั่นมันจะทำให้ง่ายขึ้น ใช่ระบบใด ๆ ที่ไม่มีจุดเข้าเดียวจะปวดหัวที่สำคัญในการปรับปรุง
Frank Forte

PHP ไม่แสดงข้อยกเว้นที่ไม่สามารถจัดการได้หรือไม่? ค่อนข้างแน่ใจหรือไม่
Martin Tournoij

ควรแสดงข้อยกเว้นที่ไม่สามารถจัดการได้ หากคุณเปิดบัฟเฟอร์เอาต์พุตที่จุดเริ่มต้น (เพื่อให้คุณสามารถส่งส่วนหัว ณ จุดใด ๆ ก่อนที่จะล้างเนื้อหาการตอบสนองในที่สุด) บางทีข้อความข้อยกเว้นอาจหายไปที่ไหนสักแห่ง
Frank Forte


33

ใช้:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

นี่เป็นวิธีที่ดีที่สุดในการเขียน แต่ข้อผิดพลาดทางไวยากรณ์ให้ผลลัพธ์ที่ว่างดังนั้นใช้คอนโซลเพื่อตรวจสอบข้อผิดพลาดทางไวยากรณ์ วิธีที่ดีที่สุดในการดีบักโค้ด PHP คือการใช้คอนโซล เรียกใช้ต่อไปนี้:

php -l phpfilename.php


20

สร้างไฟล์ชื่อphp.iniในโฟลเดอร์ที่ไฟล์ PHP ของคุณอยู่

ใน php.ini เพิ่มรหัสต่อไปนี้ (ฉันให้ข้อผิดพลาดง่าย ๆ ที่แสดงรหัส):

display_errors = on

display_startup_errors = on

18

นี่คือสคริปต์ PHP:

<?php
    ini_set("display_startup_errors", 1);
    ini_set("display_errors", 1);

    /* Reports for either E_ERROR | E_WARNING | E_NOTICE  | Any Error*/
    error_reporting(E_ALL);

    echo(abc); /* Notice: abc is an undefined constant */
?>

สำหรับคำอธิบายรายละเอียดของข้อผิดพลาด PHP, เยี่ยมชมข้อผิดพลาด PHP - error_reporting ()


2
สิ่งนี้แตกต่างจากคำตอบของแฟนซีจอห์นอย่างไร?
คนงานทุกคนมีความจำเป็น

@ cpburnz - มันเป็นคำถามที่ตรงไปตรงมาทุกคนได้รับชุดรหัสเดียวกันในรสชาติของพวกเขาที่แตกต่างเท่านั้น ฉันได้รับลิงค์ URL เพิ่มเติมที่จะให้ข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาด PHP
B.Balamanigandan

15

หากแม้จะปฏิบัติตามคำตอบทั้งหมดข้างต้น (หรือคุณไม่สามารถแก้ไขไฟล์ php.ini ของคุณได้) คุณยังไม่สามารถรับข้อความแสดงข้อผิดพลาดลองสร้างไฟล์ PHP ใหม่ที่เปิดใช้งานการรายงานข้อผิดพลาดแล้วรวมไฟล์ปัญหา เช่น:

error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');

แม้จะมีทุกอย่างที่ตั้งไว้อย่างถูกต้องในphp.iniไฟล์ของฉันนี่เป็นวิธีเดียวที่ฉันสามารถจับข้อผิดพลาด namespace สถานการณ์ที่แน่นอนของฉันคือ:

//file1.php
namespace a\b;
class x {
    ...
}

//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
    ...
}

1
ไม่การรายงานข้อผิดพลาดไม่ใช่ loglevel เป็นบิตฟิลด์ การใช้ 999999 เป็นความคิดที่แย่มาก ๆให้ใช้ power-of-two ลบ 1 เช่น 2047!
peterh - Reinstate Monica

คุณพูดถูกแล้ว @peterh! ฉันเปลี่ยนเป็น E_ALL เนื่องจากจะทำให้สามารถรายงานข้อผิดพลาดทั้งหมด (ยกเว้นข้อผิดพลาดที่เข้มงวดใน php 5.4 และด้านล่าง)
jxmallett

15

ฉันมักจะไปกับรหัสต่อไปนี้ในโครงการ PHP ธรรมดาของฉัน

if(!defined('ENVIRONMENT')){
    define('ENVIRONMENT', 'DEVELOPMENT');
}

$base_url = null;

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'DEVELOPMENT':
            $base_url = 'http://localhost/product/';
            ini_set('display_errors', 1);
            ini_set('display_startup_errors', 1);
            error_reporting(E_ALL|E_STRICT);
            break;

        case 'PRODUCTION':
            $base_url = 'Production URL'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;

        default:
            exit('The application environment is not set correctly.');
    }
}

15

เมื่อใช้ PHP เป็นโมดูล Apache เราสามารถเปลี่ยนการตั้งค่าการกำหนดค่าโดยใช้คำสั่งในไฟล์การกำหนดค่า Apache (เช่น httpd.conf) และไฟล์. htaccess คุณจะต้องใช้สิทธิ์“ AllowOverride Options” หรือ“ AllowOverride All”

ตรวจสอบสิ่งนี้

http://funbird.co.uk/blog/tech-articals/linux-tech-articals/enabling-error-display-php-via-htaccess


ลิงก์ใช้งานไม่ได้ (404)
Peter Mortensen

14

หากคุณพบว่าตัวเองอยู่ในสถานการณ์ที่คุณไม่สามารถแก้ไขการตั้งค่าผ่านphp.iniหรือ.htaccessคุณโชคไม่ดีที่แสดงข้อผิดพลาดเมื่อสคริปต์ PHP ของคุณมีข้อผิดพลาดในการแยกวิเคราะห์ จากนั้นคุณต้องแก้ไขทับหลังไฟล์ในบรรทัดคำสั่งดังนี้:

find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"

ถ้าโฮสต์ของคุณถูกล็อคเพื่อให้ลงว่ามันไม่ได้ช่วยให้การเปลี่ยนค่าผ่านทางphp.iniหรือมันอาจจะยังไม่อนุญาตเปลี่ยนค่าผ่านทาง.htaccess ini_setคุณสามารถตรวจสอบได้ด้วยสคริปต์ PHP ต่อไปนี้:

<?php
if( !ini_set( 'display_errors', 1 ) ) {
  echo "display_errors cannot be set.";
} else {
  echo "changing display_errors via script is possible.";
}

find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'ง่ายขึ้น
โคน

14

ในขณะที่เรากำลังเรียกใช้ PHP 7 คำตอบที่ได้รับที่นี่จะไม่ถูกต้องอีกต่อไป สิ่งเดียวที่ยังคงโอเคคือสิ่งเดียวจาก Frank Forteในขณะที่เขาพูดเกี่ยวกับ PHP 7

ในอีกด้านหนึ่งแทนที่จะพยายามจับข้อผิดพลาดด้วยการลอง / จับคุณสามารถใช้เคล็ดลับ: ใช้รวม

นี่คือรหัสสามชิ้น:

ไฟล์: tst1.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    // Missing " and ;
    echo "Testing
?>

ใช้งานใน PHP 7 จะไม่แสดงอะไรเลย

ตอนนี้ลองทำสิ่งนี้:

ไฟล์: tst2.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    include ("tst3.php");
?>

ไฟล์: tst3.php

<?php
    // Missing " and ;
    echo "Testing
?>

ตอนนี้รัน tst2 ซึ่งตั้งค่าการรายงานข้อผิดพลาดจากนั้นรวม tst3 แล้วคุณจะได้เห็น:

ข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดทางไวยากรณ์, จุดสิ้นสุดไฟล์ที่ไม่คาดคิด, คาดหวังว่าตัวแปร (T_VARIABLE) หรือ $ {(T_DOLLAR_OPEN_CURLY_BRACES) หรือ {$ (T_CURLY_OPEN) ใน tst3.php ที่บรรทัด 4


13

คุณสามารถทำสิ่งต่อไปนี้:

ตั้งค่าพารามิเตอร์ด้านล่างในไฟล์ดัชนีหลักของคุณ:

    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);

จากนั้นขึ้นอยู่กับความต้องการของคุณคุณสามารถเลือกที่คุณต้องการแสดง:

สำหรับทุกข้อผิดพลาดคำเตือนและประกาศ:

    error_reporting(E_ALL); OR error_reporting(-1);

สำหรับข้อผิดพลาดทั้งหมด :

    error_reporting(E_ERROR);

สำหรับคำเตือนทั้งหมด :

    error_reporting(E_WARNING);

สำหรับประกาศทั้งหมด :

    error_reporting(E_NOTICE);

สำหรับข้อมูลเพิ่มเติมโปรดดูที่นี่


อะไรคือสิ่งที่"แฟ้มดัชนีหลัก" ? ไฟล์index.html?
ปีเตอร์มอร์เทนเซ่น

12

คุณสามารถเพิ่มตัวจัดการข้อผิดพลาดที่กำหนดเองของคุณเองซึ่งสามารถให้ข้อมูลการแก้ไขข้อบกพร่องเพิ่มเติม นอกจากนี้คุณสามารถตั้งค่าเพื่อส่งข้อมูลทางอีเมล

function ERR_HANDLER($errno, $errstr, $errfile, $errline){
    $msg = "<b>Something bad happened.</b> [$errno] $errstr <br><br>
    <b>File:</b> $errfile <br>
    <b>Line:</b> $errline <br>
    <pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";

    echo $msg;

    return false;
}

function EXC_HANDLER($exception){
    ERR_HANDLER(0, $exception->getMessage(), $exception->getFile(), $exception->getLine());
}

function shutDownFunction() {
    $error = error_get_last();
    if ($error["type"] == 1) {
        ERR_HANDLER($error["type"], $error["message"], $error["file"], $error["line"]);
    }
}

set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");

7

รหัสด้านบนนี้ควรใช้งานได้:

error_reporting(E_ALL);

อย่างไรก็ตามพยายามแก้ไขรหัสในโทรศัพท์ในไฟล์:

error_reporting =on

6

ทางออกที่ดีที่สุด / ง่าย / เร็วที่คุณสามารถใช้ได้หากเป็นการดีบั๊กคือการล้อมรอบโค้ดของคุณด้วยการจับข้อยกเว้น นั่นคือสิ่งที่ฉันทำเมื่อฉันต้องการตรวจสอบบางสิ่งบางอย่างที่รวดเร็วในการผลิต

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

สำหรับ php7 catch (Throwable $e)นั้นดีกว่า ... หรือบล็อก catch อื่นที่อยู่ด้านล่างcatch(Error $e)
Frank Forte


4

นั่นคือสิ่งที่ฉันเรียนรู้ ในไฟล์ PHP.INI

error_reporting = E_ALL
display_errors = On

2
กำลังเปลี่ยน กำลังเพิ่ม
ปีเตอร์มอร์เทนเซ่น

คำตอบของคุณไม่สมเหตุสมผลเพราะมันไม่มีบริบท ยังกำหนดโดย Peter Mortensen ไม่ปรับปรุงมันเตรียมไว้สำหรับ "ตั้งค่าสถานะเพื่อลบ" (โดยบอท) (จากการตรวจสอบคุณภาพต่ำ)
ZF007

4
    <?php
    // Turn off error reporting
    error_reporting(0);

    // Report runtime errors
    error_reporting(E_ERROR | E_WARNING | E_PARSE);

    // Report all errors
    error_reporting(E_ALL);

    // Same as error_reporting(E_ALL);
    ini_set("error_reporting", E_ALL);

    // Report all errors except E_NOTICE
    error_reporting(E_ALL & ~E_NOTICE);
    ?>

ขณะที่ไซต์ของคุณใช้งานอยู่php.iniไฟล์ควรปิดการใช้งาน display_errors ด้วยเหตุผลด้านความปลอดภัย อย่างไรก็ตามสำหรับสภาพแวดล้อมการพัฒนา display_errors สามารถเปิดใช้งานสำหรับการแก้ไขปัญหา


4

คุณสามารถทำได้โดยการเปลี่ยนไฟล์ php.ini และเพิ่มสิ่งต่อไปนี้

display_errors = on
display_startup_errors = on

หรือคุณสามารถใช้รหัสต่อไปนี้เพราะมันใช้ได้กับฉันเสมอ

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

3

หากคุณมีXdebugติดตั้งอยู่คุณสามารถแทนที่การตั้งค่าทุกอย่างโดยการตั้งค่า:

xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;

force_display_errors

ประเภท: int, ค่าเริ่มต้น: 0, เปิดตัวใน Xdebug> = 2.3 หากการตั้งค่านี้ถูกตั้งค่าเป็น 1 ข้อผิดพลาดจะปรากฏขึ้นเสมอไม่ว่าการตั้งค่าของ display_errors ของ PHP จะเป็นอย่างไร

force_error_reporting

ประเภท: int, ค่าเริ่มต้น: 0, เปิดตัวใน Xdebug> = 2.3 การตั้งค่านี้เป็นบิตมาสค์เช่น error_reporting bitmask นี้จะมีเหตุผล ORed ด้วย bitmask ที่แสดงโดย error_reporting ถึง dermine ซึ่งข้อผิดพลาดควรจะแสดง การตั้งค่านี้สามารถทำได้ใน php.ini เท่านั้นและอนุญาตให้คุณบังคับให้แสดงข้อผิดพลาดบางอย่างไม่ว่าแอปพลิเคชันจะทำอย่างไรกับ ini_set ()


3

คุณอาจต้องการใช้รหัสนี้:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

2

รายงานข้อผิดพลาดทั้งหมดยกเว้น E_NOTICE

error_reporting(E_ALL & ~E_NOTICE);

แสดงข้อผิดพลาด PHP ทั้งหมด

error_reporting(E_ALL);  or ini_set('error_reporting', E_ALL);

ปิดการรายงานข้อผิดพลาดทั้งหมด

error_reporting(0);

1

ใน Unix CLIเป็นประโยชน์อย่างมากในการเปลี่ยนเส้นทางเฉพาะข้อผิดพลาดไปยังไฟล์ :

./script 2> errors.log

จากนั้นมาจากเชลล์อื่นสำหรับการเปลี่ยนแปลงสด:

tail -f errors.log

หรือเพียงแค่

watch cat errors.log

นั่นจะตอบคำถามเกี่ยวกับ PHP ได้อย่างไร
Peter Mortensen

./scriptเป็นสคริปต์ php CLI (hashbang #!/usr/bin/php) คุณสามารถเปลี่ยนเส้นทางข้อผิดพลาด php ในไฟล์ด้วยวิธีนี้ นี่คือระบบยูนิกซ์ นี่ไม่ใช่ PHP เป็น CGI
NVRM

0

หากอยู่บนบรรทัดคำสั่งคุณสามารถเรียกใช้phpด้วย-ddisplay_errors=1เพื่อแทนที่การตั้งค่าในphp.ini:

php -ddisplay_errors=1 script.php

-1

นอกเหนือจากphp.iniและini_set()ฟังก์ชั่นในสคริปต์ PHP คุณสามารถทำสิ่งเดียวกันกับ.htaccessและhttpd.confคำสั่งที่แสดงด้านล่าง

ผู้ให้บริการโฮสต์บางรายอนุญาตให้ตั้งค่า PHP ผ่าน.htaccessและhttpd.confและ

ซ่อนข้อผิดพลาด PHP

php_flag display_startup_errors ON

php_flag display_errors ON

php_flag html_errors ON

php_flag log_errors on

php_flag ignore_repeated_errors off

php_flag ignore_repeated_source off

php_flag report_memleaks on

php_flag track_errors on

php_value docref_root 0

php_value docref_ext 0

php_value error_log /home/path/public_html/domain/PHP_errors.log

php_value error_reporting 999999999

php_value error_reporting -1

php_value log_errors_max_len 0

Order allow,deny

Deny from all

Satisfy All

พบคำตอบนี้โดย googling นิดหน่อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.