ฉันจะปิดการแจ้งเตือน PHP ได้อย่างไร


126
Notice: Constant DIR_FS_CATALOG already defined

ผมเคยให้ความเห็นไปแล้วdisplay_errorsในphp.iniแต่ไม่ทำงาน

ฉันจะทำให้ PHP ไม่ส่งออกสิ่งนั้นไปยังเบราว์เซอร์ได้อย่างไร

UPDATE

ฉันใส่ไว้ที่display_errors = Offนั่น แต่ยังคงรายงานการแจ้งเตือนดังกล่าว

นี่เป็นปัญหากับ PHP 5.3 หรือไม่

รายงานCall Stack จำนวนมากด้วย ..


3
หากคุณใช้ Apache คุณอาจต้องรีสตาร์ทเซิร์ฟเวอร์ของคุณ! หากคุณใช้ XAMPP เพียงแค่เลือก "รีสตาร์ท" ในแอปตัวจัดการ
st4wik

2
ฉันขอแนะนำให้วิ่งgrep display_errors /path/to/php.iniเพื่อดูว่าบรรทัดของคุณถูกลบล้างไปที่ใดที่หนึ่งของไฟล์หรือไม่ นี่คือสิ่งที่เกิดขึ้นกับฉัน
usandfriends

Error_reporting เป็นวิธีแก้ปัญหา
David Stienen

ลองini_set('display_errors',0)ในไฟล์ php ของคุณ เมื่อการตั้งค่าของคุณไม่ทำงานคุณควรตรวจสอบว่าphpinfo()แสดงค่าที่คุณต้องการหรือไม่ ถ้าไม่ใช่คุณเปลี่ยน ini-file ผิดหรือมีบางอย่างเขียนทับค่าของคุณจาก php.ini
Radon8472

มันไม่มีข้อผิดพลาด php 5.3 display_errors ทำงานตั้งแต่ php 4.0.3 จนถึงเวอร์ชันล่าสุด @see 3v4l.org/87gIl
Radon8472

คำตอบ:


78

คุณสามารถตั้งค่าdisplay_errorsการ0หรือใช้error_reporting()ฟังก์ชั่น

อย่างไรก็ตามการแจ้งเตือนเป็นสิ่งที่น่ารำคาญ (ฉันสามารถเห็นอกเห็นใจได้บางส่วน ) แต่มันเป็นไปตามวัตถุประสงค์ คุณไม่ควรกำหนดค่าคงที่สองครั้งครั้งที่สองจะไม่ทำงานและค่าคงที่จะไม่เปลี่ยนแปลง!


4
+1: ฉันเห็นด้วยกับการกล่าวถึงว่าเขาควรแก้ไขข้อผิดพลาดไม่ใช่ปิดการรายงาน และคุณทำได้อย่างอ่อนโยนกว่า @Jonathan Kuhn :-)
Josh

1
ไม่ดูเหมือนว่านี่จะเป็นบั๊กของ php5.3 display_errorsไม่ทำงานตามที่คาดไว้
user198729

@user ลองใช้phpinfo()เพื่อดูว่าการตั้งค่านี้ใช้ได้จริงหรือไม่ ยกโทษให้ฉัน แต่ฉันสงสัยอย่างยิ่งว่าคุณพบข้อผิดพลาดใน PHP 5.3 - ฉันจะเชื่อก็ต่อเมื่อฉันเห็น :)
Pekka

แปลกlocal valueคือเปิด แต่master valueปิดไม่รู้ว่าหมายถึงอะไรกันแน่ ...
user198729

1
@user ฉันคิดว่าค่าในเครื่องอาจมาจากini_setคำสั่งหรือ php_ini_flagการตั้งค่าใน.htaccessไฟล์
Pekka

242

จากเอกสาร PHP ( error_reporting ):

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

ตัวเลือกที่น่าสนใจอื่น ๆ สำหรับฟังก์ชันนั้น:

<?php

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL & ~E_NOTICE);
// For PHP < 5.3 use: E_ALL ^ E_NOTICE

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

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

?>

เป็นประโยชน์มากและให้คำตอบสำหรับคำถาม แม้ว่าฉันจะรู้ว่าการแก้ไขประกาศทั้งหมดจะดีกว่า บางครั้งอาจเป็นประโยชน์ในการแสดงทุกอย่างยกเว้นการแจ้งเตือน
Timo002

3
การปิดการแจ้งเตือนเท่านั้นไม่ได้ผลสำหรับฉันโดยใช้ ^ NOTICE ตามที่ระบุไว้ในโพสต์ด้านบน สำหรับ PHP v5.3 ใช้: E_ALL & ~ E_NOTICE
Chizzle

หากคุณมี REST API ที่ส่งคืน JSON หรือ XML หรืออะไรก็ตามคุณอาจต้องการปิดสิ่งเหล่านี้ หรืออย่างน้อยก็แปลงเป็นข้อยกเว้นและจัดการตามนั้น
TheRealChx101

สวัสดี. ทำงานให้ฉัน ขอบคุณมาก.
H. Farid

Display_errors ควบคุมหากข้อผิดพลาดถูกส่งไปยัง stdoutput แต่เมื่อคุณเปลี่ยน error_reporting เป็น 0 คุณจะปิดใช้งานการจัดการข้อผิดพลาดและการบันทึกข้อผิดพลาดทั้งหมดโดยสิ้นเชิง .. คุณไม่ควรทำ error_reporting (0)
Radon8472

30

สำหรับ php บรรทัดคำสั่งให้ตั้งค่า

error_reporting = E_ALL & ~E_NOTICE

ใน /etc/php5/cli/php.ini

phpการดำเนินการคำสั่งจากนั้น ommits การแจ้งเตือน


โดยทำ error_reporting = E_ALL & ~ E_NOTICE & ~ E_WARNING ใน php.ini ปิดการใช้งานประกาศ PHP และคำเตือน PHP เพื่อให้ไม่มีการแจ้งเตือน php และคำเตือน php ในเบราว์เซอร์
Deepak Lamichhane

สิ่งนี้ใช้สำหรับการตั้งค่า php คอนโซล หากคุณใช้ php ในการสร้างหน้าเว็บบนไฟล์ config เว็บเซิร์ฟเวอร์ apache2 คือ /etc/php5/apache2/php.ini ควรใช้ phpinfo () เพื่อดูว่าไฟล์ config ใดถูกใช้งานจริง
MilanG

23
<?php

// Turn off all error reporting
error_reporting(0);

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

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

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

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

?>

ที่มาhttp://php.net/manual/en/function.error-reporting.php


2
นี่ไม่ใช่คำตอบที่ซ้ำกันที่โพสต์ไว้เมื่อหลายปีก่อนหรือ
ปาง

เราทั้งสองได้คัดลอกวางจากเอกสาร php และทั้งสองคำตอบได้กล่าวถึงแหล่งข้อมูล
Abhishek Goel

@AbhishekGoel Unicorns เป็นม้าปลอมตัวคำพูดนั้นไม่เกี่ยวข้องคุณยังคงทำซ้ำคำตอบที่มีอยู่แล้วในอีกสี่ปีต่อมา
Ricky Boyce

@RickyB ฉันไม่ได้ตรวจสอบคำตอบที่มีอยู่และฉันก็ไม่ได้คัดลอก
Abhishek Goel


6

คุณกำลังมองหา:

php -d error_reporting="E_ERROR | E_WARNING | E_PARSE"

2
สวัสดี @Christian และยินดีต้อนรับสู่ StackOverflow! ในอนาคตจะดีมากถ้าคุณสามารถเพิ่มคำอธิบาย / รายละเอียดเพิ่มเติมเล็กน้อยในคำตอบของคุณเพื่อให้ความกระจ่างแก่ผู้ที่เห็นว่าทำไม / วิธีแก้ปัญหาทำงาน / แก้ไขปัญหาได้อย่างไร ขอบคุณมากและมีความสุขในการเขียนโค้ด :)
Zachary Kniebel

1
ตรง! ฉันใช้/usr/bin/php -d error_reporting="E_ERROR | E_WARNING | E_PARSE" -f /path/to/file.phpสำหรับ crontab ของฉัน
vladkras

4

ฉันไม่ต้องการตั้งค่าerror_reportingภายในรหัสของฉัน แต่ในกรณีหนึ่งผลิตภัณฑ์ดั้งเดิมมีประกาศมากมายที่ต้องซ่อนไว้

ดังนั้นฉันจึงใช้ตัวอย่างต่อไปนี้เพื่อตั้งค่าที่กำหนดค่าไว้บนเซิร์ฟเวอร์สำหรับerror_reportingแต่ลบE_NOTICEs

error_reporting(error_reporting() & ~E_NOTICE);

ตอนนี้การตั้งค่าการรายงานข้อผิดพลาดสามารถต่อการกำหนดค่าในหรือphp.ini .htaccessการแจ้งเท่านั้นจะถูกปิดใช้งานเสมอ


3

คุณสามารถตั้งค่าในสคริปต์ของคุณหรือกำหนดข้อผิดพลาดที่คุณไม่ต้องการที่จะแสดงผลด้วยini_set('display_errors',0);error_reporting()


ฉันจำเป็นต้องใช้ini_setวิธีที่กล่าวถึงที่นี่error_reporting(0)วิธีที่กล่าวถึงในที่อื่นไม่มีผลใด ๆ
pix

2

โดยไม่ก่อให้เกิดข้อผิดพลาด:

defined('DIR_FS_CATALOG') || define('DIR_FS_CATALOG', 'whatever');

หากคุณต้องการจริงๆให้เปลี่ยนการรายงานข้อผิดพลาดโดยใช้ error_reporting () เป็น E_ALL ^ ​​E_NOTICE


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

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

แม้ว่าคำตอบของคุณจะไม่ "ดีที่สุด" แต่ดูเหมือนว่าจะตอบคำถามของ OP ได้อย่างเต็มที่ +1 ให้กับคำตอบของคุณและ / หวังว่าจะถูกทำเครื่องหมายว่าเป็นคำตอบเพราะเป็นคำตอบที่ถูกต้อง
Nazca

@Nazca ใช่ฉันได้เปลี่ยนพฤติกรรมของฉันและพยายามเป็นมิตรมากขึ้น :)
Jonathan Kuhn


1

ฉันพบเคล็ดลับนี้เมื่อไม่นานมานี้ ตี @ ที่จุดเริ่มต้นของบรรทัดที่อาจทำให้เกิดคำเตือน / ข้อผิดพลาด

ราวกับมีเวทมนตร์พวกเขาก็หายไป


21
นั่นเป็นความคิดที่ไม่ดีโดยทั่วไปแล้วมันเหมือนกับการใส่ที่อุดหูเพราะรถของคุณส่งเสียงเจียรที่น่ากลัว
David Morrow

10
สิ่งนี้เหมาะสมอย่างยิ่งสำหรับบางอินสแตนซ์ตัวอย่างเช่นเมื่อแสดงผลตัวแปรไม่ว่าจะตั้งค่าไว้หรือว่างเปล่า
Frans

1
สิ่งนี้จะสมเหตุสมผลเมื่อคุณมีบางอย่างเช่นปลั๊กอิน WordPress ที่ผู้เขียนยังไม่ได้อัปเดตและคุณรู้ว่าอะไรเป็นสาเหตุของปัญหา มันเป็นการช่วยเหลือวงดนตรีไม่ใช่การแก้ไข
จำเป็น

ฉันชอบทั้ง error_reporting () และ "@" ฉันไม่ทราบถึงสิ่งเหล่านี้ ขอบคุณ. ฉันชอบ "@" เนื่องจากมีฟังก์ชันการทำงานเดียวกันของ error_reporting (0) และพิมพ์ได้ง่ายกว่า หากปัญหาเหมือน "ไม้แขวนเสื้อที่กักไอเสีย" มากกว่า "เสียงเจียรที่น่ากลัว" ก็จะทำให้โครงการเดินหน้าต่อไปได้ ฉันสามารถค้นหาและแก้ไขได้อย่างง่ายดายเมื่อมีเวลา สิ่งนี้ช่วยแก้ปัญหาที่ข้อผิดพลาดเกิดจากข้อมูลที่อ่านจากไฟล์จึงไม่มีปัญหาการพิมพ์ผิดหรือไลบรารี
Mark Longmire

1
ตรวจสอบให้แน่ใจว่าคุณได้ใส่ @ ที่ซึ่งคุณมั่นใจ 100% ว่าคุณกำลังทำอะไรอยู่
นิค

1

ใช้ phpinfo () และค้นหาConfiguration File (php.ini) Pathเพื่อดูว่าไฟล์กำหนดค่าพา ธ สำหรับ php ใดถูกใช้ PHP สามารถมีไฟล์กำหนดค่าได้หลายไฟล์ขึ้นอยู่กับสภาพแวดล้อมที่กำลังทำงานอยู่ โดยปกติสำหรับคอนโซลมัน:

/etc/php5/cli/php.ini

และสำหรับ php ที่รันโดย apache มันคือ:

/etc/php5/apache2/php.ini

จากนั้นกำหนดerror_reportingวิธีที่คุณต้องการ:

http://www.phpknowhow.com/configuration/php-ini-error-settings/ http://www.zootemplate.com/news-updates/how-to-disable-notice-and-warning-in-phpini- ไฟล์


1

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

ดังนั้นเพื่อหลีกเลี่ยงข้อผิดพลาดในเบราว์เซอร์ของคุณคุณใช้display_errorsแฟล็กตามที่พบแล้ว:

display_errors = Off

ตอนนี้ปัญหาที่แท้จริงคือเมื่อคุณเรียกใช้โค้ดของคนอื่น ในกรณีนี้การแก้ไขโค้ดมีแนวโน้มที่จะถูกเขียนทับทุกครั้งที่คุณอัปเกรดรหัสนั้น ทำให้การรักษารหัสนั้นเป็นเรื่องน่าเบื่อ

ในกรณีของฉันฉันใช้ PHP crontabเพื่อให้wp-cron.phpสคริปต์ทำงานนาน ๆ ครั้ง ฉันได้รับข้อผิดพลาดที่ส่งไปยังอีเมลของฉันซึ่งจะน่าเบื่อเมื่อคุณได้รับอีเมลหนึ่งฉบับทุกๆ 10 นาที! ในกรณีนั้นระบบ Wordpress มีไฟล์การกำหนดค่ารวมถึง a WP_DEBUGและพวกเขาเรียกใช้error_reporting()ฟังก์ชันดังนั้นการพยายามเปลี่ยนerror_reportingตัวแปรในบรรทัดคำสั่งจะไม่ทำงาน แต่คุณต้องแก้ไขwp-config.phpไฟล์ในโฟลเดอร์รูทและตรวจสอบให้แน่ใจว่าWP_DEBUGได้ตั้งค่าเป็นfalseไฟล์. มิฉะนั้นคุณจะได้รับคำเตือนและประกาศทั้งหมดเหล่านั้นตลอดเวลา



0

ฉันเชื่อว่าการแสดงความคิดเห็นใน display_errors ใน php.ini จะไม่ทำงานเนื่องจากค่าเริ่มต้นคือเปิด คุณต้องตั้งค่าเป็น "ปิด" แทน

อย่าลืมรีสตาร์ท Apache เพื่อใช้การเปลี่ยนแปลงการกำหนดค่า

โปรดทราบว่าในขณะที่คุณสามารถตั้งค่า display_errors ในรันไทม์ได้ แต่การเปลี่ยนแปลงที่นี่จะไม่ส่งผลต่อข้อผิดพลาด FATAL

ตามที่ผู้อื่นระบุไว้โดยหลักการแล้วในระหว่างการพัฒนาคุณควรเรียกใช้โดย error_reporting ในระดับสูงสุดที่เป็นไปได้และเปิดใช้งาน display_errors ในขณะที่คุณเริ่มต้นครั้งแรกน่ารำคาญข้อผิดพลาดคำเตือนประกาศและคำแนะนำในการเขียนโค้ดที่เข้มงวดเหล่านี้ล้วนเพิ่มขึ้นและช่วยให้คุณกลายเป็น coder ที่ดีขึ้นได้


0

ค่าคงที่กำหนดสองเท่า

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

if ( ! defined( 'DIR_FS_CATALOG' ) ) 
  define( 'DIR_FS_CATALOG', 'something...' );

โดยส่วนตัวแล้วฉันจะเริ่มด้วยการค้นหาค่าคงที่ในโค้ดDIR_FS_CATALOGเบสจากนั้นแทนที่นิยามคู่ด้วยสิ่งนี้

การซ่อนการแจ้งเตือน PHP แบบอินไลน์เป็นกรณี ๆ ไป

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

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

นี่คือตัวอย่าง:

// Intentional file error
$missing_file = @file( 'non_existent_file' );

ข้อมูลเพิ่มเติมสามารถพบได้ในเอกสารError Control Operators ของ PHP

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