ฉันจะรับข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์ใน PHP ได้อย่างไร
บ่อยครั้งที่ฉันพยายามเรียกใช้สคริปต์ PHP และได้หน้าจอว่างกลับมา ไม่มีข้อความแสดงข้อผิดพลาด เป็นเพียงหน้าจอว่างเปล่า สาเหตุอาจเกิดจากข้อผิดพลาดทางไวยากรณ์อย่างง่าย (วงเล็บไม่ถูกต้องเครื่องหมายอัฒภาคที่ขาดหายไป) หรือการเรียกใช้ฟังก์ชันที่ล้มเหลวหรืออย่างอื่นทั้งหมด
เป็นเรื่องยากมากที่จะเข้าใจว่าเกิดอะไรขึ้น ฉันลงท้ายด้วยการแสดงความคิดเห็นออกรหัสป้อนคำสั่ง "echo" ทุกที่ ฯลฯ พยายาม จำกัด ปัญหาให้แคบลง แต่มันต้องมีวิธีที่ดีกว่านี้แน่ ๆ ใช่ไหม?
มีวิธีรับ PHP เพื่อสร้างข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์เช่นเดียวกับ Java หรือไม่?
คำตอบ
สำหรับข้อผิดพลาดทางไวยากรณ์คุณต้องเปิดใช้งานการแสดงข้อผิดพลาดใน 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/
ต่อไปนี้เปิดใช้งานข้อผิดพลาดทั้งหมด:
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
รหัสต่อไปนี้ควรแสดงข้อผิดพลาดทั้งหมด:
<?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 ของฉันเองโดยไม่ได้ทดสอบ แต่ฉันแน่ใจว่ามันใช้งานได้
คุณสามารถรวมบรรทัดต่อไปนี้ในไฟล์ที่คุณต้องการแก้ไขข้อบกพร่อง:
error_reporting(E_ALL);
ini_set('display_errors', '1');
สิ่งนี้จะลบล้างการตั้งค่าเริ่มต้นใน php.ini ซึ่งทำให้ PHP รายงานข้อผิดพลาดไปยังบันทึก
ข้อผิดพลาดและคำเตือนมักจะปรากฏใน....\logs\php_error.log
หรือ....\logs\apache_error.log
ขึ้นอยู่กับการตั้งค่า php.ini ของคุณ
ข้อผิดพลาดที่เป็นประโยชน์มักจะถูกส่งไปยังเบราว์เซอร์ แต่เนื่องจากเป็น html ที่ไม่ถูกต้องจึงไม่ปรากฏ
ดังนั้น"tail -f
"ไฟล์บันทึกของคุณและเมื่อคุณได้รับหน้าจอว่างให้ใช้ IEs" view "-> ตัวเลือกเมนู" source "เพื่อดูผลลัพธ์ดิบ
การกำหนดค่า PHP
2 รายการในphp.iniกำหนดผลลัพธ์ของข้อผิดพลาด:
- display_errors
- 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รายการ
ฉันมักจะใช้ไวยากรณ์นี้ที่ด้านบนสุดของสคริปต์ php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On'); //On or Off
มีส่วนขยายที่มีประโยชน์มากที่เรียกว่า " xdebug " ซึ่งจะทำให้รายงานของคุณดีขึ้นมากเช่นกัน
สำหรับการแก้ไขปัญหาแบบลงมือปฏิบัติจริงอย่างรวดเร็วฉันมักจะแนะนำที่นี่ใน SO:
error_reporting(~0); ini_set('display_errors', 1);
ที่จะใส่ไว้ตอนต้นของสคริปต์ที่อยู่ระหว่างการแก้ไขปัญหา สิ่งนี้ไม่สมบูรณ์แบบตัวแปรที่สมบูรณ์แบบคือคุณยังเปิดใช้งานสิ่งนั้นในphp.ini
และคุณบันทึกข้อผิดพลาดใน PHP เพื่อตรวจจับไวยากรณ์และข้อผิดพลาดในการเริ่มต้น
การตั้งค่าที่ระบุไว้ที่นี่จะแสดงข้อผิดพลาดประกาศและคำเตือนทั้งหมดรวมถึงข้อผิดพลาดที่เข้มงวดไม่ว่า PHP เวอร์ชันใดก็ตาม
สิ่งต่อไปที่ควรพิจารณา:
- ติดตั้งXdebugและเปิดใช้งานการดีบักระยะไกลด้วย IDE ของคุณ
ดูด้วย:
- การรายงานข้อผิดพลาด (PHP ทางที่ถูกต้อง)
- เอกสารค่าคงที่ที่กำหนดไว้ล่วงหน้า
- error_reporting()เอกสาร
- display_errorsเอกสาร
เป็นไปได้ที่จะลงทะเบียนขอเกี่ยวเพื่อให้มองเห็นข้อผิดพลาดหรือคำเตือนล่าสุด
function shutdown(){
var_dump(error_get_last());
}
register_shutdown_function('shutdown');
การเพิ่มรหัสนี้ไปยังจุดเริ่มต้นของคุณ index.php จะช่วยคุณแก้ปัญหาได้
ถ้าคุณเจ๋งสุด ๆ คุณอาจลอง:
$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% ของข้อผิดพลาดที่ฉันทำนั่นไม่ใช่ปัญหา
ที่ด้านบนของหน้าให้เลือกพารามิเตอร์
error_reporting(E_ERROR | E_WARNING | E_PARSE);
นี่เป็นปัญหาของการกำหนดค่าที่โหลดเทียบกับรันไทม์
สิ่งสำคัญคือต้องตระหนักว่าข้อผิดพลาดทางไวยากรณ์หรือข้อผิดพลาดในการแยกวิเคราะห์เกิดขึ้นระหว่างขั้นตอนการคอมไพล์หรือการแยกวิเคราะห์ซึ่งหมายความว่า 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 จะไม่สามารถแยกวิเคราะห์โค้ดของคุณได้เพราะมันจะไม่ถึงรันไทม์
หากต้องการคงอยู่และทำให้มันสะดวกสบายคุณสามารถแก้ไขไฟล์ php.ini ของคุณ โดยปกติจะเก็บไว้ใน/etc/php.ini
หรือ/etc/php/php.ini
แต่ในเครื่องมากกว่าphp.ini
อาจเขียนทับได้ทั้งนี้ขึ้นอยู่กับแนวทางการตั้งค่าของผู้ให้บริการโฮสติ้งของคุณ ตรวจสอบphpinfo()
ไฟล์Loaded Configuration File
ที่ด้านบนเพื่อให้แน่ใจว่าไฟล์ใดถูกโหลดล่าสุด
ค้นหา display_errors ในไฟล์นั้น ควรมีเพียง 3 อินสแตนซ์ซึ่งมี 2 รายการที่แสดงความคิดเห็น
เปลี่ยนบรรทัดที่ไม่ใส่ความคิดเห็นเป็น:
display_errors = stdout
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>");
}
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);
นอกจากนี้คุณจะได้รับข้อมูลรายละเอียดเพิ่มเติมกับxdebug
ฉันแนะนำNette Tracyเพื่อให้เห็นภาพข้อผิดพลาดและข้อยกเว้นใน PHP ได้ดีขึ้น:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
error_reporting(E_ALL | E_STRICT);
และเปิดข้อผิดพลาดในการแสดงผลใน php.ini
คุณสามารถลงทะเบียนตัวจัดการข้อผิดพลาดของคุณเองใน 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');
สองบรรทัดสำคัญที่คุณต้องการเพื่อให้ได้ข้อผิดพลาดที่เป็นประโยชน์จาก 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;
}
FirePHPก็มีประโยชน์เช่นกัน
เปิด php.ini ของคุณตรวจสอบให้แน่ใจว่าได้ตั้งค่าเป็น:
display_errors = On
รีสตาร์ทเซิร์ฟเวอร์ของคุณ
คุณอาจต้องการลองใช้ PHPStorm เป็นโปรแกรมแก้ไขโค้ดของคุณ จะพบ PHP และข้อผิดพลาดทางไวยากรณ์อื่น ๆ มากมายในขณะที่คุณพิมพ์ในโปรแกรมแก้ไข
หากคุณเป็นผู้ใช้อูบุนตูให้ไปที่เทอร์มินัลของคุณและเรียกใช้คำสั่งนี้
sudo tail -50f /var/log/apache2/error.log
โดยจะแสดงข้อผิดพลาด 50 รายการล่าสุด มีไฟล์ข้อผิดพลาดerror.log
สำหรับ apache2 ซึ่งบันทึกข้อผิดพลาดทั้งหมด
หากต้องการเปิดการรายงานข้อผิดพลาดทั้งหมดให้เพิ่มสิ่งนี้ลงในสคริปต์ของคุณ:
error_reporting(E_ALL);
สิ่งนี้ทำให้แม้แต่คำเตือนเพียงเล็กน้อยก็ปรากฏขึ้น และในกรณี:
ini_set('display_errors', '1');
จะบังคับให้แสดงข้อผิดพลาด สิ่งนี้ควรปิดในเซิร์ฟเวอร์ที่ใช้งานจริง แต่ไม่ใช่เมื่อคุณกำลังพัฒนา
“ ข้อผิดพลาด” เป็นสิ่งที่มีประโยชน์ที่สุดสำหรับนักพัฒนาในการทราบข้อผิดพลาดและแก้ไขเพื่อให้ระบบทำงานได้อย่างสมบูรณ์แบบ
PHP มอบวิธีที่ดีกว่าในการทำความรู้จักกับนักพัฒนาว่าเหตุใดและที่ส่วนของโค้ดจึงได้รับข้อผิดพลาดดังนั้นการรู้ข้อผิดพลาดเหล่านั้นนักพัฒนาสามารถทำให้โค้ดของพวกเขาดีขึ้นได้หลายวิธี
วิธีที่ดีที่สุดในการเขียนสองบรรทัดต่อไปนี้ที่ด้านบนของสคริปต์เพื่อรับข้อความแสดงข้อผิดพลาดทั้งหมด:
error_reporting(E_ALL);
ini_set("display_errors", 1);
อีกวิธีในการใช้เครื่องมือดีบักเกอร์เช่นxdebugใน IDE ของคุณ
คุณสามารถเปิดใช้งานการรายงานข้อผิดพลาดทั้งหมด (รวมถึงประกาศและข้อความที่เข้มงวด) บางคนพบว่าสิ่งนี้ละเอียดเกินไป แต่ก็คุ้มค่าที่จะลอง ตั้งค่า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"
นอกเหนือจาก 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
สำหรับผู้ที่ใช้ nginx และมีหน้าจอสีขาวแม้กระทั่งสำหรับไฟล์<?php echo 123;
. ในกรณีของฉันฉันไม่มีตัวเลือกที่จำเป็นสำหรับ PHP ในไฟล์กำหนดค่า nginx:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
ตัวเลือกนี้ไม่ได้อยู่ในไฟล์ fastcgi_params ดังนั้น PHP จึงไม่ทำงานและไม่มีข้อผิดพลาดใด ๆ ในบันทึก