PHP 5 ปิดใช้งานข้อผิดพลาดมาตรฐานที่เข้มงวด


175

ฉันต้องตั้งค่าสคริปต์ PHP ที่ด้านบนเพื่อปิดการรายงานข้อผิดพลาดสำหรับมาตรฐานที่เข้มงวด

ใครช่วยได้บ้าง


8
@ 451F: ฉันคิดว่าคำสำคัญที่นี่คือ "มาตรฐานที่เข้มงวด" ฉันไม่ทราบเกี่ยวกับเวอร์ชันก่อนหน้า แต่แนะนำให้ใช้ PHP 5.4.0 เพื่อตั้งข้อผิดพลาดในการE_ALL & ~E_DEPRECATED & ~E_STRICTผลิต โปรดสังเกตว่าพวกเขาแนะนำให้คุณปิดใช้งานมาตรฐานที่เข้มงวด
รหัสปลอม Monkey Rashid

ค้นหาไฟล์ php.ini ของคุณและคัดลอกไปยัง / usr / local / php5 / lib /
yadhu

คำตอบ:


185

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

# in your PHP code:
ini_set('display_errors', '0');     # don't show any errors...
error_reporting(E_ALL | E_STRICT);  # ...but do log them

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


11
เพื่อระบุชัดเจน: แน่นอนคุณสามารถตั้งค่าเหล่านี้ในphp.iniไฟล์ของคุณเช่นถ้าคุณไม่สามารถแก้ไขรหัส PHP
sschuberth

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

4
สิ่งนี้ใช้ไม่ได้สำหรับฉัน - ต้องใช้ E_ALL & ~ E_STRICT จาก Fake Code Monkey Rashid แสดงความคิดเห็นจากคำตอบด้านล่าง
บน

1
มันทำงานร่วมกับสิ่งต่อไปนี้ที่ฉันพบใน php.ini log_errors = On Vs ini_set ('display_errors', '0'); หนึ่งชุดสุดท้ายชนะหรือไม่
ลงจอด

@nate เมื่อคุณโพสต์รหัสโปรดบอกเราว่าเราจะวางมันได้ที่ไหน ผมไม่ทราบว่าจะนำมันเข้าphp.iniหรือ.htaccessหรือที่ไหนสักแห่งในโค้ด PHP ของฉัน
ДаниилПронин

89

สำหรับไม่มีข้อผิดพลาด

error_reporting(0);

หรือเพียงแค่ไม่เข้มงวด

error_reporting(E_ALL ^ E_STRICT);

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

error_reporting(-1);


56
+1: ฉันเชื่อว่า^มันดีสำหรับการละเว้นข้อผิดพลาดประเภทเดียวเท่านั้น หากคุณต้องการปิดประเภทเพิ่มเติมคุณควรใช้E_ALL & ~E_DEPRECATED & ~E_STRICTรูปแบบ หรืออาจจะเป็น(E_ALL & ~(E_DEPRECATED | E_STRICT))รูปแบบ
รหัสปลอม Monkey Rashid

10
หมายเหตุ: E_STRICT เป็นเพียงส่วนหนึ่งของ E_ALL ตั้งแต่ php 5.4
Fred Haslam

@ FakeCodeMonkeyRashid ฉันสงสัยว่าทำไมถึงเป็นเช่นนั้น? อาจเป็นเพราะคำสั่งอพยพเป็นสิ่งสำคัญหรือไม่
codeling

หยุดการรายงานข้อผิดพลาด STRICT ใน PHP <5.4 ini_set('error_reporting', E_ALL&~E_STRICT); ระงับการรายงานข้อผิดพลาดini_set('error_reporting', E_ALL^E_STRICT);
STRICT

ฉันต้องการชี้ให้เห็นว่าการใช้^("xor") มากกว่า& ~("และไม่ใช่") เป็นความคิดที่ไม่ดี ! ^ขึ้นอยู่กับสมมติฐานที่ว่าเช่น E_STRICT เป็นส่วนหนึ่งของ E_ALL และมักจะเป็นส่วนหนึ่งของมัน สิ่งนี้ไม่ดีเนื่องจาก E_ALL เปลี่ยนไปในอดีต (E_STRICT ไม่ได้ผ่านมา แต่ตอนนี้เปลี่ยนมาจาก PHP 5.4) หากสมมติฐานล้มเหลวในหนึ่งวัน^จะไม่เพียง แต่ทำลาย แต่จริง ๆ แล้วตรงข้ามกับสิ่งที่ควรทำ: มันจะเปิดใช้งาน E_STRICT เนื่องจาก XOR ( ^) ทำงานอย่างไร & ~อย่างไรก็ตามจะปิดใช้งาน E_STRICT เสมอไม่ว่าค่าปัจจุบันของ E_ALL จะเป็นเท่าใดก็ตาม ดังนั้น& ~ควรใช้
เจย์

31

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

php_flag display_errors off

หรือ

php_value display_errors 0

ถัดไปเพื่อตั้งค่าการรายงานข้อผิดพลาด

php_value error_reporting 30719

หากคุณสงสัยว่าค่า30719มา E_ALL (32767), E_STRICT (2048) เป็นค่าคงที่ที่เก็บค่าตัวเลขและ ( 32767 - 2048 = 30719)


2
ขอบคุณมาก - นี่เป็นเคล็ดลับ (.htaccess solution) ใน PHP 5.4.7 - ไม่มีอะไรอีกเลยแม้แต่การแก้ไข. ini ก็กำลังทำเคล็ดลับอยู่

ฉันใช้php_admin_value error_reportingเพื่อการทำงาน (ใน vhost config)
Lou Terrailloune

@Seza แก้ไขให้ถูกต้อง
Starx

1
มันไม่เกี่ยวกับหน้าวิธีนี้เป็นที่ต้องการเพราะข้อผิดพลาด E_STRICT ส่วนใหญ่รวบรวมเวลาและไม่สามารถแทนที่ในรันไทม์
AbiusX

2
สวัสดีเพียงเพื่อให้ง่ายขึ้นเล็กน้อยสำหรับผู้ใช้ wamp คุณสามารถปิดใช้งานข้อผิดพลาดได้โดยคลิก php> php settings >> แสดงข้อผิดพลาด หากมีการตรวจสอบแล้วยกเลิกการเลือก
Hemang Rami

9

ค่าเริ่มต้นของการตั้งค่าสถานะerror_reportingคือE_ALL & ~ E_NOTICEหากไม่ได้ตั้งค่าใน php.ini แต่ในการติดตั้งบางส่วน (โดยเฉพาะการติดตั้งที่กำหนดเป้าหมายสภาพแวดล้อมการพัฒนา) จะมีE_ALL | E_STRICTตั้งค่าเป็นค่าสถานะนี้ (นี่คือค่าที่แนะนำระหว่างการพัฒนา ) ในบางกรณีโดยเฉพาะอย่างยิ่งเมื่อคุณต้องการเรียกใช้โครงการโอเพนซอร์สบางอย่างที่พัฒนามาก่อนยุค PHP 5.3 และยังไม่ได้ปรับปรุงด้วยแนวปฏิบัติที่ดีที่สุดที่กำหนดโดย PHP 5.3 ในสภาพแวดล้อมการพัฒนาของคุณ ข้อความเหมือนที่คุณได้รับ วิธีที่ดีที่สุดในการรับมือกับสถานการณ์นี้คือการตั้งค่าE_ALLเป็นค่าของerror_reporting flag ทั้งในphp.iniหรือในรหัส (อาจอยู่ใน front-controller เช่น index.php ใน web-root ดังต่อไปนี้:

if(defined('E_STRICT')){
    error_reporting(E_ALL);
}


4

WordPress

ถ้าคุณทำงานในสภาพแวดล้อม WordPress ที่ Wordpress กำหนดระดับความผิดพลาดในไฟล์ WP-รวมถึง load.php / wp_debug_mode()ในการทำงาน ดังนั้นคุณต้องเปลี่ยนระดับหลังจากที่ฟังก์ชั่นนี้ถูกเรียก (ในไฟล์ที่ไม่ได้รับการตรวจสอบในคอมไพล์เพื่อการพัฒนาเท่านั้น) หรือแก้ไขการerror_reporting()โทรโดยตรง


สิ่งนี้มีประโยชน์จริง ๆ ฉันมีโหมดดีบั๊กสำหรับการติดตั้ง Wordpress หนึ่งครั้งและไม่รู้ว่ามันทำเช่นนี้ ขอบคุณสำหรับข้อมูล!
ทิม

2

ฉันไม่เห็นคำตอบที่สะอาดและเหมาะสำหรับซอฟต์แวร์ที่พร้อมใช้งานสำหรับการผลิตดังนั้นจึงเป็นเช่นนี้:

/*
 * Get current error_reporting value,
 * so that we don't lose preferences set in php.ini and .htaccess
 * and accidently reenable message types disabled in those.
 *
 * If you want to disable e.g. E_STRICT on a global level,
 * use php.ini (or .htaccess for folder-level)
 */
$old_error_reporting = error_reporting();

/*
 * Disable E_STRICT on top of current error_reporting.
 *
 * Note: do NOT use ^ for disabling error message types,
 * as ^ will re-ENABLE the message type if it happens to be disabled already!
 */
error_reporting($old_error_reporting & ~E_STRICT);


// code that should not emit E_STRICT messages goes here


/*
 * Optional, depending on if/what code comes after.
 * Restore old settings.
 */
error_reporting($old_error_reporting);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.