ฉันจะดูข้อความแสดงข้อผิดพลาดได้อย่างไรเมื่อฉันได้รับหน้าจอสีขาวแห่งความตาย


25

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

คำตอบ:


33

วางสิ่งนี้ไว้ที่ด้านล่างของ 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);

นี่เป็นสิ่งที่ยอดเยี่ยมสำหรับไซต์พัฒนาแม้ว่าฉันจะชอบ /var/log/apache2/error.log สำหรับไซต์สด งานนี้แม้ว่า :)
Citricguy

17

ทรัพยากรหน้าจอสีขาวแห่งความตาย (หน้าเปล่าโดยสิ้นเชิง)บน 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);

10

ดูบันทึกข้อผิดพลาด Apache ใน Ubuntu มันตั้งอยู่ใน/var/log/apache2/error.logเพื่อให้คุณสามารถทำ:

tail -f /var/log/apache2/error.log

2
sudo tail -f /var/log/apache2/error.log
Citricguy

1
หากคุณมี vhost จำนวนมากที่มีไฟล์บันทึกที่กำหนดเองสำหรับแต่ละไฟล์ให้ใช้สิ่งนี้: sudo tail -f /var/log/apache2/*.log จากนั้นรีเฟรชหน้าเว็บที่ลงท้ายด้วย wsod
izus

2

ฉันพบวิธีที่ง่ายในการติดตามข้อผิดพลาด 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)


1
คุณเป็นคนช่วยชีวิต ไม่มีการเปลี่ยนแปลงการตั้งค่า php ไร้สาระสำหรับฉัน แต่สิ่งนี้ได้หลอกลวง!
เกร็กซอมเมอร์

1

หากคุณกำลังใช้ drush คุณสามารถดูข้อความแสดงข้อผิดพลาดโดยใช้คำสั่ง drush-ws


0

ฉันเพิ่งเปลี่ยนตัวแปร $ update_free_access จาก FALSE เป็น TRUE และเรียกใช้ไฟล์ update.php มันแก้ไขปัญหาของฉัน


0

คุณสามารถแก้ไข 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>';
}

ข้อความแสดงข้อผิดพลาดจะแสดงไฟล์และบรรทัดของรหัสที่ทำให้เกิดข้อผิดพลาด

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