นี่เป็นปัญหาของการโหลดกับการกำหนดค่ารันไทม์
สิ่งสำคัญคือต้องทราบว่ามีข้อผิดพลาดทางไวยากรณ์หรือข้อผิดพลาดในการแยกวิเคราะห์เกิดขึ้นในระหว่างการคอมไพล์หรือขั้นตอนการแยกวิเคราะห์ซึ่งหมายความว่า PHP จะประกันตัวก่อนที่จะมีโอกาสรันโค้ดใด ๆ ของคุณ ดังนั้นหากคุณกำลังปรับเปลี่ยนการdisplay_errors
กำหนดค่าของ PHP ในระหว่างรันไทม์ (ซึ่งรวมถึงสิ่งใด ๆ จากการใช้ini_set
ในรหัสของคุณเป็นการใช้. htaccess ซึ่งเป็นไฟล์การกำหนดค่ารันไทม์) ดังนั้นเฉพาะการตั้งค่าการโหลดที่โหลดเริ่มต้นเท่านั้น
วิธีหลีกเลี่ยง WSOD ในการพัฒนาอยู่เสมอ
เพื่อหลีกเลี่ยงการ WSOD ที่คุณต้องการเพื่อให้แน่ใจว่าคุณแฟ้มการกำหนดค่าโหลดมีdisplay_errors
ในและerror_reporting
ชุด-1
( นี้เป็น E_ALL เทียบเท่าเพราะมันช่วยให้มั่นใจบิตทั้งหมดจะถูกเปิดโดยไม่คำนึงถึงรุ่นของ PHP คุณกำลังใช้งาน ) อย่า hardcode ค่าคงที่ของ E_ALL เนื่องจากค่านั้นอาจเปลี่ยนแปลงได้ระหว่าง PHP เวอร์ชันต่างๆ
การกำหนดค่าที่โหลดเป็นphp.ini
ไฟล์ที่โหลดหรือไฟล์ของคุณapache.conf
หรือhttpd.conf
ไฟล์ virtualhost ไฟล์เหล่านั้นจะถูกอ่านเพียงครั้งเดียวในช่วงเริ่มต้น (เมื่อคุณเริ่ม 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();
จากนั้นชี้เบราว์เซอร์ของคุณไปที่นั่นแล้วดูที่Loaded Configuration Fileและไฟล์. 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) จะใช้ไฟล์ที่display_errors
ใช้งานจริงซึ่งปิดไว้ตามค่าเริ่มต้นซึ่งโดยทั่วไปแล้วจะทำให้เกิดความยุ่งยากเช่นเดียวกับที่คุณเคยประสบมา เนื่องจาก PHP ปิดใช้งานแล้วเมื่อเริ่มทำงานจากนั้นจึงพบข้อผิดพลาดทางไวยากรณ์หรือการแยกวิเคราะห์และไม่มีการออกผลลัพธ์ คุณคาดหวังว่าini_set('display_errors',1);
สคริปต์ PHP ที่อยู่ด้านบนของคุณควรหลีกเลี่ยงสิ่งนั้น แต่จะไม่สำคัญว่า PHP จะแยกรหัสของคุณไม่ได้หรือไม่เพราะมันจะไม่ไปถึงรันไทม์