ฉันจะรับข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์ใน PHP ได้อย่างไร

May 10 2009

บ่อยครั้งที่ฉันพยายามเรียกใช้สคริปต์ PHP และได้หน้าจอว่างกลับมา ไม่มีข้อความแสดงข้อผิดพลาด เป็นเพียงหน้าจอว่างเปล่า สาเหตุอาจเกิดจากข้อผิดพลาดทางไวยากรณ์อย่างง่าย (วงเล็บไม่ถูกต้องเครื่องหมายอัฒภาคที่ขาดหายไป) หรือการเรียกใช้ฟังก์ชันที่ล้มเหลวหรืออย่างอื่นทั้งหมด

เป็นเรื่องยากมากที่จะเข้าใจว่าเกิดอะไรขึ้น ฉันลงท้ายด้วยการแสดงความคิดเห็นออกรหัสป้อนคำสั่ง "echo" ทุกที่ ฯลฯ พยายาม จำกัด ปัญหาให้แคบลง แต่มันต้องมีวิธีที่ดีกว่านี้แน่ ๆ ใช่ไหม?

มีวิธีรับ PHP เพื่อสร้างข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์เช่นเดียวกับ Java หรือไม่?

คำตอบ

510 DarrylHein May 10 2009 at 16:52

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

php_flag  display_errors        on
php_value error_reporting       2039

คุณอาจต้องการพิจารณาใช้ค่า E_ALL (ตามที่ Gumbo กล่าวไว้) สำหรับ PHP เวอร์ชันของคุณerror_reportingเพื่อรับข้อผิดพลาดทั้งหมด ข้อมูลเพิ่มเติม

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

error_reporting(-1);
ini_set('display_errors', 'On');

(3) อีกตัวเลือกหนึ่งคือการใช้โปรแกรมแก้ไขที่การตรวจสอบข้อผิดพลาดเมื่อคุณพิมพ์เช่นPhpEd PhpEd ยังมาพร้อมกับดีบักเกอร์ซึ่งสามารถให้ข้อมูลรายละเอียดเพิ่มเติม (โปรแกรมดีบักเกอร์ PhpEd คล้ายกับ xdebug มากและรวมเข้ากับตัวแก้ไขโดยตรงดังนั้นคุณจึงใช้ 1 โปรแกรมเพื่อทำทุกอย่าง)

ลิงค์ของ Cartman ก็ดีมากเช่นกัน:http://www.ibm.com/developerworks/library/os-debug/

458 Eljakim Jul 05 2011 at 02:46

ต่อไปนี้เปิดใช้งานข้อผิดพลาดทั้งหมด:

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

ดูลิงค์ต่อไปนี้ด้วย

  • http://php.net/manual/en/errorfunc.configuration.php#ini.display-errors
  • http://php.net/manual/en/errorfunc.configuration.php#ini.display-startup-errors
  • http://php.net/manual/en/function.error-reporting.php
176 m4dm4x1337 Aug 13 2013 at 18:59

รหัสต่อไปนี้ควรแสดงข้อผิดพลาดทั้งหมด:

<?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last())) { return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array( 0x0001 => 'E_ERROR', 0x0002 => 'E_WARNING', 0x0004 => 'E_PARSE', 0x0008 => 'E_NOTICE', 0x0010 => 'E_CORE_ERROR', 0x0020 => 'E_CORE_WARNING', 0x0040 => 'E_COMPILE_ERROR', 0x0080 => 'E_COMPILE_WARNING', 0x0100 => 'E_USER_ERROR', 0x0200 => 'E_USER_WARNING', 0x0400 => 'E_USER_NOTICE', 0x0800 => 'E_STRICT', 0x1000 => 'E_RECOVERABLE_ERROR', 0x2000 => 'E_DEPRECATED', 0x4000 => 'E_USER_DEPRECATED' ); if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN'; }; return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message))); }; $old_error_handler = set_error_handler("ErrorHandler");

// other php code

?>

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

61 Tomalak May 10 2009 at 16:54

คุณสามารถรวมบรรทัดต่อไปนี้ในไฟล์ที่คุณต้องการแก้ไขข้อบกพร่อง:

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

สิ่งนี้จะลบล้างการตั้งค่าเริ่มต้นใน php.ini ซึ่งทำให้ PHP รายงานข้อผิดพลาดไปยังบันทึก

61 JamesAnderson Sep 25 2009 at 11:22

ข้อผิดพลาดและคำเตือนมักจะปรากฏใน....\logs\php_error.logหรือ....\logs\apache_error.logขึ้นอยู่กับการตั้งค่า php.ini ของคุณ

ข้อผิดพลาดที่เป็นประโยชน์มักจะถูกส่งไปยังเบราว์เซอร์ แต่เนื่องจากเป็น html ที่ไม่ถูกต้องจึงไม่ปรากฏ

ดังนั้น"tail -f"ไฟล์บันทึกของคุณและเมื่อคุณได้รับหน้าจอว่างให้ใช้ IEs" view "-> ตัวเลือกเมนู" source "เพื่อดูผลลัพธ์ดิบ

55 Madara'sGhost Feb 03 2014 at 03:47

การกำหนดค่า PHP

2 รายการในphp.iniกำหนดผลลัพธ์ของข้อผิดพลาด:

  1. display_errors
  2. error_reporting

ในการผลิต , display_errorsมักจะมีการตั้งค่าOff(ซึ่งเป็นสิ่งที่ดีเพราะการแสดงผลผิดพลาดในสถานที่ผลิตโดยทั่วไปจะไม่เป็นที่น่าพอใจ!)

อย่างไรก็ตามในการพัฒนาควรตั้งค่าเป็นเพื่อOnให้แสดงข้อผิดพลาด ตรวจสอบ !

error_reporting(ณ PHP 5.3) ถูกตั้งค่าโดยค่าเริ่มต้นเป็นE_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(หมายถึงทุกอย่างจะแสดงยกเว้นประกาศมาตรฐานที่เข้มงวดและประกาศเกี่ยวกับการเลิกใช้งาน) เมื่อสงสัยตั้งค่าให้E_ALLเพื่อแสดงทุกข้อผิดพลาด ตรวจสอบ !

โอ้โฮ! ไม่เช็ค! ฉันไม่สามารถเปลี่ยน php.ini ของฉันได้!

ที่น่าเสียดาย โดยปกติแล้วโฮสต์ที่ใช้ร่วมกันจะไม่อนุญาตให้มีการเปลี่ยนแปลงไฟล์ php.ini ดังนั้นจึงไม่สามารถใช้ตัวเลือกดังกล่าวได้อย่างน่าเศร้า แต่อย่ากลัว! เรามีทางเลือกอื่น !

การกำหนดค่ารันไทม์

ในสคริปต์ที่ต้องการเราสามารถแก้ไขรายการ php.ini ในรันไทม์ได้! ความหมายมันจะทำงานเมื่อสคริปต์ทำงาน! หวาน!

error_reporting(E_ALL);
ini_set("display_errors", "On");

สองบรรทัดนี้จะให้ผลเช่นเดียวกับการแก้ไขรายการ php.ini ตามด้านบน! สุดยอด!

ฉันยังคงได้รับหน้าว่าง / ข้อผิดพลาด 500!

นั่นหมายความว่าสคริปต์ไม่ได้ทำงานด้วยซ้ำ! ซึ่งมักเกิดขึ้นเมื่อคุณมีข้อผิดพลาดทางไวยากรณ์!

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

บันทึกข้อผิดพลาด

นอกจากนี้ PHP โดยค่าเริ่มต้นบันทึกข้อผิดพลาด ในโฮสติ้งที่ใช้ร่วมกันอาจอยู่ในโฟลเดอร์เฉพาะหรือในโฟลเดอร์เดียวกับสคริปต์ที่กระทำผิด

หากคุณมีสิทธิ์เข้าถึง php.ini คุณสามารถค้นหาได้ในerror_logรายการ

31 FDisk Sep 25 2009 at 14:48

ฉันมักจะใช้ไวยากรณ์นี้ที่ด้านบนสุดของสคริปต์ php

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off
30 gnarf May 10 2009 at 16:59

มีส่วนขยายที่มีประโยชน์มากที่เรียกว่า " xdebug " ซึ่งจะทำให้รายงานของคุณดีขึ้นมากเช่นกัน

27 hakre Jan 24 2013 at 22:06

สำหรับการแก้ไขปัญหาแบบลงมือปฏิบัติจริงอย่างรวดเร็วฉันมักจะแนะนำที่นี่ใน SO:

error_reporting(~0); ini_set('display_errors', 1);

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

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

สิ่งต่อไปที่ควรพิจารณา:

  • ติดตั้งXdebugและเปิดใช้งานการดีบักระยะไกลด้วย IDE ของคุณ

ดูด้วย:

  • การรายงานข้อผิดพลาด (PHP ทางที่ถูกต้อง)
  • เอกสารค่าคงที่ที่กำหนดไว้ล่วงหน้า
  • error_reporting()เอกสาร
  • display_errorsเอกสาร
27 EduardoOliveira Jan 06 2016 at 01:59

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

function shutdown(){
  var_dump(error_get_last());
}

register_shutdown_function('shutdown');

การเพิ่มรหัสนี้ไปยังจุดเริ่มต้นของคุณ index.php จะช่วยคุณแก้ปัญหาได้

17 RichBradshaw Jul 05 2011 at 02:49

ถ้าคุณเจ๋งสุด ๆ คุณอาจลอง:

$test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192";

ini_set('display_errors',$test_server);
error_reporting(E_ALL|E_STRICT);

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

ข้อผิดพลาดใด ๆ ที่เกิดขึ้นก่อนที่สคริปต์จะทำงานจะไม่ถูกจับ แต่สำหรับ 99% ของข้อผิดพลาดที่ฉันทำนั่นไม่ใช่ปัญหา

17 Kld May 06 2013 at 21:14

ที่ด้านบนของหน้าให้เลือกพารามิเตอร์

error_reporting(E_ERROR | E_WARNING | E_PARSE);
17 Sherif Nov 12 2015 at 13:24

นี่เป็นปัญหาของการกำหนดค่าที่โหลดเทียบกับรันไทม์

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

วิธีหลีกเลี่ยง WSOD ในการพัฒนาเสมอ

เพื่อหลีกเลี่ยงการ WSOD ที่คุณต้องการเพื่อให้แน่ใจว่าคุณแฟ้มการกำหนดค่าโหลดมีdisplay_errorsในและerror_reportingชุด-1( นี้เป็น E_ALL เทียบเท่าเพราะมันช่วยให้มั่นใจบิตทั้งหมดจะถูกเปิดโดยไม่คำนึงถึงรุ่นของ PHP คุณกำลังใช้งาน ) อย่าฮาร์ดโค้ดค่าคงที่ของ E_ALL เนื่องจากค่านั้นอาจเปลี่ยนแปลงได้ระหว่าง PHP เวอร์ชันต่างๆ

การกำหนดค่าที่โหลดคือphp.iniไฟล์ที่โหลดหรือไฟล์โฮสต์ของคุณapache.confหรือhttpd.confหรือเสมือน ไฟล์เหล่านี้จะถูกอ่านเพียงครั้งเดียวในช่วงเริ่มต้น (เช่นเมื่อคุณเริ่ม apache httpd หรือ php-fpm เป็นครั้งแรก) และถูกแทนที่โดยการเปลี่ยนแปลงคอนฟิกูเรชันรันไทม์เท่านั้น ตรวจสอบให้แน่ใจว่าdisplay_errors = 1และerror_reporting = -1ในไฟล์คอนฟิกูเรชันที่โหลดของคุณทำให้แน่ใจว่าคุณจะไม่เห็นWSODไม่ว่าจะมีข้อผิดพลาดทางไวยากรณ์หรือการแยกวิเคราะห์ที่เกิดขึ้นก่อนการเปลี่ยนแปลงรันไทม์เช่นini_set('display_errors', 1);หรือerror_reporting(E_ALL);เกิดขึ้น

วิธีค้นหาไฟล์คอนฟิกูเรชันที่โหลด (php.ini) ของคุณ

หากต้องการค้นหาไฟล์กำหนดค่าที่โหลดของคุณเพียงแค่สร้างไฟล์ PHP ใหม่โดยใช้รหัสต่อไปนี้เท่านั้น ...

<?php
phpinfo();

จากนั้นชี้เบราว์เซอร์ของคุณไปที่นั่นและดูที่ไฟล์คอนฟิกูเรชันโหลดและไฟล์. ini เพิ่มเติมที่แยกวิเคราะห์ซึ่งโดยปกติจะอยู่ที่ด้านบนสุดของคุณphpinfo()และจะรวมพา ธ สัมบูรณ์ไปยังไฟล์คอนฟิกูเรชันที่โหลดทั้งหมดของคุณ

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


เพียงแค่อย่าทำสิ่งนี้ในการผลิต

นี่เป็นวิธีที่ดีที่สุดในการหลีกเลี่ยง WSOD ในการพัฒนา ใครก็ตามที่แนะนำให้คุณใส่ini_set('display_errors', 1);หรือerror_reporting(E_ALL);ที่ด้านบนของสคริปต์ PHP ของคุณหรือใช้. htaccess เหมือนที่คุณทำที่นี่จะไม่ช่วยคุณหลีกเลี่ยง WSOD เมื่อเกิดข้อผิดพลาดทางไวยากรณ์หรือการแยกวิเคราะห์ (เช่นในกรณีของคุณที่นี่) หากไฟล์กำหนดค่าที่คุณโหลด ได้display_errorsปิด

หลายคน (และการติดตั้ง PHP ในสต็อก) จะใช้ไฟล์ production-ini ที่display_errorsปิดโดยค่าเริ่มต้นซึ่งโดยทั่วไปจะส่งผลให้เกิดความไม่พอใจเช่นเดียวกับที่คุณเคยพบที่นี่ เนื่องจาก PHP ได้ปิดใช้งานไปแล้วเมื่อเริ่มต้นระบบจึงพบข้อผิดพลาดทางไวยากรณ์หรือการแยกวิเคราะห์และไม่มีผลใด ๆ ที่จะส่งออก คุณคาดหวังว่าini_set('display_errors',1);สคริปต์ PHP ของคุณควรจะหลีกเลี่ยงสิ่งนั้น แต่จะไม่สำคัญว่า PHP จะไม่สามารถแยกวิเคราะห์โค้ดของคุณได้เพราะมันจะไม่ถึงรันไทม์

16 Ram Jul 05 2011 at 02:54

หากต้องการคงอยู่และทำให้มันสะดวกสบายคุณสามารถแก้ไขไฟล์ php.ini ของคุณ โดยปกติจะเก็บไว้ใน/etc/php.iniหรือ/etc/php/php.iniแต่ในเครื่องมากกว่าphp.iniอาจเขียนทับได้ทั้งนี้ขึ้นอยู่กับแนวทางการตั้งค่าของผู้ให้บริการโฮสติ้งของคุณ ตรวจสอบphpinfo()ไฟล์Loaded Configuration Fileที่ด้านบนเพื่อให้แน่ใจว่าไฟล์ใดถูกโหลดล่าสุด

ค้นหา display_errors ในไฟล์นั้น ควรมีเพียง 3 อินสแตนซ์ซึ่งมี 2 รายการที่แสดงความคิดเห็น

เปลี่ยนบรรทัดที่ไม่ใส่ความคิดเห็นเป็น:

display_errors = stdout
16 Eli Sep 25 2009 at 15:09

Dunno ถ้ามันจะช่วยได้ แต่นี่คือไฟล์ config มาตรฐานของฉันสำหรับโปรเจ็กต์ php ฉันมักจะไม่พึ่งพาการกำหนดค่า apache มากเกินไปแม้แต่ในเซิร์ฟเวอร์ของฉันเอง

ฉันไม่เคยมีปัญหาข้อผิดพลาดที่หายไปบางทีบางสิ่งที่นี่อาจให้ความคิดแก่คุณ

แก้ไขเพื่อแสดง APPLICATON_LIVE

/*
APPLICATION_LIVE will be used in process to tell if we are in a development or production environment.  It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
*/

if ( preg_match( "%^(www.)?livedomain.com$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', true);
} elseif ( preg_match( "%^(www.)?devdomain.net$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', false);
} else {
    die("INVALID HOST REQUEST (".$_SERVER["HTTP_HOST"].")");
    // Log or take other appropriate action.
}


/*
--------------------------------------------------------------------
DEFAULT ERROR HANDLING
--------------------------------------------------------------------
Default error logging.  Some of these may be changed later based on APPLICATION_LIVE.
*/
error_reporting(E_ALL & ~E_STRICT);
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");
ini_set ( "log_errors", 1);
ini_set ( "log_errors_max_len", 0);
ini_set ( "error_log", APPLICATION_ROOT."logs/php_error_log.txt");
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");

if ( ! APPLICATION_LIVE ) {
    // A few changes to error handling for development.
    // We will want errors to be visible during development.
    ini_set ( "display_errors", "1");
    ini_set ( "display_startup_errors", "1");
    ini_set ( "html_errors", "1");
    ini_set ( "docref_root", "http://www.php.net/");
    ini_set ( "error_prepend_string", "<div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'>");
    ini_set ( "error_append_string", "</div>");
}
15 Yan.Zero Aug 19 2014 at 22:36
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

นอกจากนี้คุณจะได้รับข้อมูลรายละเอียดเพิ่มเติมกับxdebug

15 OndřejŠotek Jul 16 2015 at 05:38

ฉันแนะนำNette Tracyเพื่อให้เห็นภาพข้อผิดพลาดและข้อยกเว้นใน PHP ได้ดีขึ้น:

15 AbuzerFirdousi Dec 05 2017 at 03:54
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
10 ÓlafurWaage May 10 2009 at 16:54
error_reporting(E_ALL | E_STRICT);

และเปิดข้อผิดพลาดในการแสดงผลใน php.ini

9 soulmerge May 10 2009 at 16:54

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

function dump_error_to_file($errno, $errstr) {
    file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');
7 CodeSynthesis Jun 10 2014 at 20:37

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

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

ตามที่ระบุไว้โดยผู้ร่วมให้ข้อมูลรายอื่นสิ่งเหล่านี้จะถูกปิดโดยค่าเริ่มต้นด้วยเหตุผลด้านความปลอดภัย เคล็ดลับที่เป็นประโยชน์ - เมื่อคุณตั้งค่าไซต์ของคุณคุณควรทำการสลับสำหรับสภาพแวดล้อมที่แตกต่างกันเพื่อให้ข้อผิดพลาดเหล่านี้เปิดโดยค่าเริ่มต้นในสภาพแวดล้อมในพื้นที่และการพัฒนาของคุณ สิ่งนี้สามารถทำได้โดยใช้รหัสต่อไปนี้ (ควรอยู่ใน index.php หรือไฟล์ config ของคุณเพื่อให้สามารถใช้งานได้ตั้งแต่เริ่มต้น):

switch($_SERVER['SERVER_NAME'])
{
    // local
    case 'yourdomain.dev':
    // dev
    case 'dev.yourdomain.com':
        ini_set('display_errors',1);
        error_reporting(E_ALL);
    break;
    //live
    case 'yourdomain.com':
        //...
    break;
}
6 RichBradshaw May 10 2009 at 17:21

FirePHPก็มีประโยชน์เช่นกัน

6 user577803 Jan 17 2011 at 03:59

เปิด php.ini ของคุณตรวจสอบให้แน่ใจว่าได้ตั้งค่าเป็น:

display_errors = On

รีสตาร์ทเซิร์ฟเวอร์ของคุณ

6 user1681048 Jun 18 2014 at 08:03

คุณอาจต้องการลองใช้ PHPStorm เป็นโปรแกรมแก้ไขโค้ดของคุณ จะพบ PHP และข้อผิดพลาดทางไวยากรณ์อื่น ๆ มากมายในขณะที่คุณพิมพ์ในโปรแกรมแก้ไข

6 AshutoshJha Nov 10 2014 at 18:23

หากคุณเป็นผู้ใช้อูบุนตูให้ไปที่เทอร์มินัลของคุณและเรียกใช้คำสั่งนี้

sudo tail -50f /var/log/apache2/error.log

โดยจะแสดงข้อผิดพลาด 50 รายการล่าสุด มีไฟล์ข้อผิดพลาดerror.logสำหรับ apache2 ซึ่งบันทึกข้อผิดพลาดทั้งหมด

5 DanielSorichetti May 10 2009 at 19:09

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

error_reporting(E_ALL);

สิ่งนี้ทำให้แม้แต่คำเตือนเพียงเล็กน้อยก็ปรากฏขึ้น และในกรณี:

ini_set('display_errors', '1');

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

5 Noname Feb 01 2014 at 13:24

“ ข้อผิดพลาด” เป็นสิ่งที่มีประโยชน์ที่สุดสำหรับนักพัฒนาในการทราบข้อผิดพลาดและแก้ไขเพื่อให้ระบบทำงานได้อย่างสมบูรณ์แบบ

PHP มอบวิธีที่ดีกว่าในการทำความรู้จักกับนักพัฒนาว่าเหตุใดและที่ส่วนของโค้ดจึงได้รับข้อผิดพลาดดังนั้นการรู้ข้อผิดพลาดเหล่านั้นนักพัฒนาสามารถทำให้โค้ดของพวกเขาดีขึ้นได้หลายวิธี

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

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

อีกวิธีในการใช้เครื่องมือดีบักเกอร์เช่นxdebugใน IDE ของคุณ

4 AymanHourieh May 10 2009 at 16:58

คุณสามารถเปิดใช้งานการรายงานข้อผิดพลาดทั้งหมด (รวมถึงประกาศและข้อความที่เข้มงวด) บางคนพบว่าสิ่งนี้ละเอียดเกินไป แต่ก็คุ้มค่าที่จะลอง ตั้งค่าerror_reportingเป็นE_ALL | E_STRICTใน php.ini ของคุณ

error_reporting = E_ALL | E_STRICT

E_STRICT จะแจ้งให้คุณทราบเกี่ยวกับฟังก์ชันที่เลิกใช้งานและให้คำแนะนำเกี่ยวกับวิธีการที่ดีที่สุดในการทำงานบางอย่าง

หากคุณไม่ต้องการการแจ้ง แต่คุณพบว่าข้อความประเภทอื่นมีประโยชน์ให้ลองยกเว้นการแจ้งเตือน:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

ตรวจสอบให้แน่ใจว่าdisplay_errorsได้เปิดใช้งานใน php.ini แล้ว หากเวอร์ชัน PHP ของคุณเก่ากว่า 5.2.4 ให้ตั้งค่าเป็นOn:

display_errors = "On"

หากเวอร์ชันของคุณเป็น 5.2.4 หรือใหม่กว่าให้ใช้:

display_errors = "stderr"
4 jmucchiello May 11 2009 at 01:16

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

[Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9
3 AVKurov Jul 05 2017 at 16:04

สำหรับผู้ที่ใช้ nginx และมีหน้าจอสีขาวแม้กระทั่งสำหรับไฟล์<?php echo 123;. ในกรณีของฉันฉันไม่มีตัวเลือกที่จำเป็นสำหรับ PHP ในไฟล์กำหนดค่า nginx:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

ตัวเลือกนี้ไม่ได้อยู่ในไฟล์ fastcgi_params ดังนั้น PHP จึงไม่ทำงานและไม่มีข้อผิดพลาดใด ๆ ในบันทึก