Làm thế nào để xem các thông báo lỗi khi tôi nhận được màn hình trắng của cái chết?


25

Làm cách nào tôi có thể thấy các thông báo lỗi khi trang web tôi đang làm việc có màn hình trắng?

Câu trả lời:


33

Đặt cái này ở dưới cùng của 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);

Điều này rất tốt cho các trang web phát triển mặc dù tôi thích /var/log/apache2/error.log cho các trang web trực tiếp. Điều này làm việc mặc dù. :)
Citricguy

17

Tài nguyên của Màn hình trắng (Trang hoàn toàn trống) trên drupal.org sẽ hướng dẫn bạn các bước để xem thông báo lỗi cũng như các sự cố phổ biến gây ra chúng.

Lỗi "vô hình"

Nếu báo cáo lỗi bị tắt, bạn có thể nhận được một lỗi nghiêm trọng nhưng không nhìn thấy nó. Trên một trang web sản xuất, thông thường đã tắt báo cáo lỗi. Nếu đó là trường hợp và PHP đã gặp phải một lỗi không thể phục hồi, thì cả lỗi lẫn nội dung đều không được hiển thị, do đó bạn kết thúc với một trang hoàn toàn trống.

Những gì bạn có thể làm về việc này là bật báo cáo lỗi PHP để nó hiển thị một thông báo trên chính trang đó hoặc kiểm tra các tệp nhật ký của bạn (từ máy chủ) để tìm lỗi. Làm thế nào để làm cả hai điều này được giải thích dưới đây.

Bật báo cáo lỗi

Mặc dù nó có thể bị tắt trên các máy chủ thương mại và trang web sản xuất (vì lý do chính đáng để người dùng không thấy lỗi), những lỗi này là một trong những công cụ tốt nhất để khắc phục sự cố của bạn. Để bật báo cáo lỗi, hãy tạm thời chỉnh sửa tệp index.php của bạn (thường nằm trong thư mục gốc của bạn) ngay sau thẻ PHP mở đầu tiên (không chỉnh sửa thông tin tệp thực tế!) Để thêm vào như sau:

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

Bây giờ bạn sẽ có thể thấy bất kỳ lỗi nào xảy ra trực tiếp trên màn hình. Vấn đề bộ nhớ có thể vẫn không được hiển thị, nhưng đó là bước đầu tiên trong quá trình loại bỏ.

Nếu bạn đang sử dụng thiết lập nhiều trang và chỉ muốn xuất hiện lỗi cho một trang, thì hãy kiểm tra tên của máy chủ trước như trong:

if ($_SERVER['HTTP_HOST']==='some.domain.name.here') {
  error_reporting(E_ALL);
  ini_set('display_errors', TRUE);
  ini_set('display_startup_errors', TRUE);
}

Nếu sự cố xảy ra trong khi chạy update.php, hãy mở update.php trong trình soạn thảo văn bản và bỏ ghi chú dòng sau:

ini_set('display_errors', FALSE);

10

Hãy xem nhật ký lỗi của Apache, trong Ubuntu, nó nằm ở đâu /var/log/apache2/error.logđể bạn có thể làm:

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

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

1
nếu bạn có nhiều vhost với các tệp nhật ký tùy chỉnh cho mỗi tệp, chỉ cần sử dụng: sudo tail -f /var/log/apache2/*.log sau đó làm mới trang kết thúc bằng wsod
izus

2

Tôi đã tìm thấy cách dễ dàng để theo dõi các lỗi WSOD bằng cách chạy toàn bộ trang web thông qua drush, ví dụ:

drush rs

Sau đó truy cập trang web tại địa chỉ mới đã cho (ví dụ 127.0.0.1:8080), sau đó thử tái tạo sự cố và bạn sẽ thấy tất cả các lỗi trên màn hình thiết bị đầu cuối. Không cần phải cấu hình lại PHP của bạn, đặc biệt là trong các trường hợp khi display_errorsthất bại (ví dụ MAMP).


Một cách khó khăn khác mà tôi đã tìm thấy nó bằng cách sử dụng trình gỡ lỗi, ví dụ:

  • HĐH X:

    sudo dtruss -fn httpd 2>&1 | grep -i error
  • Linux:

    sudo strace -f $(pgrep -fn httpd) 2>&1 | grep -i error

    Lưu ý: Thay đổi httpdthành phpnếu bạn đang sử dụng drush rsnhư trên.

Hoặc cài đặt XDebugphần mở rộng PHP và tạo tệp theo dõi ( xdebug.auto_trace=1).


1
Thưa ngài, là một vị cứu tinh. Không có cài đặt php thay đổi nào vô nghĩa làm việc cho tôi, nhưng điều này đã tạo ra mánh khóe!
Greg Bolog

1

Nếu bạn đang sử dụng drush, bạn có thể thấy các thông báo lỗi bằng lệnh drush-ws.


0

Tôi vừa thay đổi giá trị $ update_free_access từ FALSE thành TRUE và thực hiện tệp update.php. Nó giải quyết vấn đề của tôi.


0

Bạn có thể sửa đổi index.php và bọc mã bằng một lần thử / bắt. Như thế này:

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>';
}

Thông báo lỗi sẽ hiển thị tệp và dòng mã gây ra lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.