ฉันจะดูข้อความแสดงข้อผิดพลาดได้อย่างไรเมื่อเว็บไซต์ที่ฉันใช้งานได้รับหน้าจอสีขาว
ฉันจะดูข้อความแสดงข้อผิดพลาดได้อย่างไรเมื่อเว็บไซต์ที่ฉันใช้งานได้รับหน้าจอสีขาว
คำตอบ:
วางสิ่งนี้ไว้ที่ด้านล่างของ settings.php:
error_reporting(-1); // Have PHP complain about absolutely everything
$conf['error_level'] = 2; // Show all messages on your screen, 2 = ERROR_REPORTING_DISPLAY_ALL.
ini_set('display_errors', TRUE); // These lines just give you content on WSOD pages.
ini_set('display_startup_errors', TRUE);
ทรัพยากรหน้าจอสีขาวแห่งความตาย (หน้าเปล่าโดยสิ้นเชิง)บน drupal.org จะดำเนินการตามขั้นตอนเพื่อดูข้อความแสดงข้อผิดพลาดรวมถึงปัญหาทั่วไปที่ทำให้เกิดปัญหา
ข้อผิดพลาด "มองไม่เห็น"
หากการรายงานข้อผิดพลาดถูกปิดคุณอาจได้รับข้อผิดพลาดร้ายแรง แต่ไม่เห็น ในไซต์การผลิตเป็นเรื่องปกติที่จะปิดการรายงานข้อผิดพลาด หากเป็นกรณีนี้และ PHP พบข้อผิดพลาดที่ไม่สามารถกู้คืนได้จะไม่มีข้อผิดพลาดหรือเนื้อหาปรากฏขึ้นดังนั้นคุณจึงต้องจบหน้าเปล่า
สิ่งที่คุณสามารถทำได้คือเปิดใช้การรายงานข้อผิดพลาดของ PHP เพื่อแสดงข้อความบนหน้าเว็บเองหรือตรวจสอบไฟล์บันทึกของคุณ (จากเซิร์ฟเวอร์) เพื่อค้นหาข้อผิดพลาด วิธีทำทั้งสองอย่างนี้อธิบายไว้ด้านล่าง
เปิดใช้งานการรายงานข้อผิดพลาด
แม้ว่าอาจถูกปิดใช้งานในโฮสต์การค้าและไซต์การผลิต (ด้วยเหตุผลที่ดีเพื่อให้ผู้ใช้ไม่เห็นข้อผิดพลาด) ข้อผิดพลาดเหล่านี้เป็นหนึ่งในเครื่องมือที่ดีที่สุดสำหรับการแก้ไขปัญหา หากต้องการเปิดใช้งานการรายงานข้อผิดพลาดให้แก้ไขไฟล์ index.php ของคุณชั่วคราว (โดยปกติจะอยู่ในไดเรกทอรีรากของคุณ) โดยตรงหลังจากเปิดแท็ก PHP ครั้งแรก (อย่าแก้ไขข้อมูลไฟล์จริง!) เพื่อเพิ่มรายการต่อไปนี้:
error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE);
ตอนนี้คุณจะสามารถดูข้อผิดพลาดที่เกิดขึ้นโดยตรงบนหน้าจอ ปัญหาหน่วยความจำอาจยังไม่ปรากฏ แต่เป็นขั้นตอนแรกในกระบวนการกำจัด
หากคุณกำลังใช้การตั้งค่าหลายไซต์และต้องการให้ข้อผิดพลาดปรากฏสำหรับไซต์เดียวให้ตรวจสอบชื่อโฮสต์ก่อนเช่นใน:
if ($_SERVER['HTTP_HOST']==='some.domain.name.here') { error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); }
หากปัญหาเกิดขึ้นขณะรัน update.php ให้เปิด update.php ใน text editor และไม่ใส่เครื่องหมายข้อคิดเห็นบรรทัดต่อไปนี้:
ini_set('display_errors', FALSE);
ดูบันทึกข้อผิดพลาด Apache ใน Ubuntu มันตั้งอยู่ใน/var/log/apache2/error.log
เพื่อให้คุณสามารถทำ:
tail -f /var/log/apache2/error.log
sudo tail -f /var/log/apache2/error.log
ฉันพบวิธีที่ง่ายในการติดตามข้อผิดพลาด WSOD โดยเรียกใช้ไซต์ทั้งหมดผ่านdrush
เช่น:
drush rs
หลังจากนั้นเข้าสู่เว็บไซต์ตามที่อยู่ใหม่ที่ให้ไว้ (เช่น127.0.0.1:8080
) จากนั้นลองทำซ้ำปัญหาและคุณจะเห็นข้อผิดพลาดทั้งหมดบนหน้าจอเทอร์มินัล ไม่จำเป็นต้องกำหนดค่า PHP ของคุณใหม่โดยเฉพาะในกรณีที่display_errors
ล้มเหลว (เช่น MAMP)
วิธีที่ยุ่งยากอื่น ๆ ที่ฉันพบโดยใช้ debuggers เช่น:
OS X:
sudo dtruss -fn httpd 2>&1 | grep -i error
ลินุกซ์:
sudo strace -f $(pgrep -fn httpd) 2>&1 | grep -i error
หมายเหตุ: เปลี่ยนhttpd
เป็นphp
หากคุณใช้drush rs
ตามที่กล่าวข้างต้น
หรือติดตั้งXDebug
ส่วนขยาย PHP และสร้างไฟล์ติดตาม ( xdebug.auto_trace=1
)
หากคุณกำลังใช้ drush คุณสามารถดูข้อความแสดงข้อผิดพลาดโดยใช้คำสั่ง drush-ws
ฉันเพิ่งเปลี่ยนตัวแปร $ update_free_access จาก FALSE เป็น TRUE และเรียกใช้ไฟล์ update.php มันแก้ไขปัญหาของฉัน
คุณสามารถแก้ไข index.php และปิดท้ายโค้ดด้วยลอง / จับ อย่างนี้:
try {
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
menu_execute_active_handler();
} catch (Error $t) {
error_log('Error at Line:' . $t->getLine() . ' File: ' . $t->getFile() . ' Message:' . $t->getMessage() );
print '<div>Message: ' . $t->getMessage() . '</div>';
print '<div>File:' . $t->getFile() . '</div>';
print '<div>Line:' . $t->getLine() . '</div>';
}
ข้อความแสดงข้อผิดพลาดจะแสดงไฟล์และบรรทัดของรหัสที่ทำให้เกิดข้อผิดพลาด