Làm thế nào tôi có thể nhận được thông báo lỗi hữu ích trong PHP?


583

Tôi thường xuyên sẽ thử và chạy một tập lệnh PHP và chỉ cần lấy lại một màn hình trống. Không có thông báo lỗi; chỉ là một màn hình trống. Nguyên nhân có thể là do lỗi cú pháp đơn giản (dấu ngoặc sai, dấu chấm phẩy bị thiếu) hoặc một lệnh gọi hàm không thành công hoặc một cái gì đó hoàn toàn khác.

Rất khó để tìm ra điều gì đã xảy ra. Tôi kết thúc việc bình luận ra mã, nhập các câu lệnh "echo" ở khắp mọi nơi, v.v ... cố gắng thu hẹp vấn đề. Nhưng chắc chắn phải có một cách tốt hơn, phải không?

Có cách nào để khiến PHP tạo ra một thông báo lỗi hữu ích, giống như Java không?




4
@JuannStrauss, đó là nói quá. Và khi bạn cuối cùng đã nhìn thấy các lỗi, nó nói T_PAAMAYIM_NEKUDOTAYIM. Hoặc có thể "phải là một thể hiện của số nguyên, số nguyên đã cho" .
Pacerier

1
Hướng dẫn về điều này: code2real.blogspot.com/2015/06/ từ
Học sinh

Câu trả lời:


498

Đối với lỗi cú pháp, bạn cần kích hoạt hiển thị lỗi trong php.ini. Theo mặc định, những mục này bị tắt vì bạn không muốn "khách hàng" nhìn thấy các thông báo lỗi. Kiểm tra trang này trong tài liệu PHP để biết thông tin về 2 chỉ thị: error_reportingdisplay_errors. display_errorscó lẽ là người bạn muốn thay đổi. Nếu bạn không thể sửa đổi php.ini, bạn cũng có thể thêm các dòng sau vào tệp .htaccess:

php_flag  display_errors        on
php_value error_reporting       2039

Bạn có thể muốn xem xét sử dụng giá trị của E_ALL (như được đề cập bởi Gumbo) cho phiên bản PHP của bạn error_reportingđể nhận tất cả các lỗi. thêm thông tin

3 mục khác: (1) Bạn có thể kiểm tra tệp nhật ký lỗi vì nó sẽ có tất cả các lỗi (trừ khi đăng nhập đã bị vô hiệu hóa). (2) Thêm 2 dòng sau sẽ giúp bạn gỡ lỗi không phải là lỗi cú pháp:

error_reporting(-1);
ini_set('display_errors', 'On');

(3) Một tùy chọn khác là sử dụng trình chỉnh sửa để kiểm tra lỗi khi bạn nhập, chẳng hạn như PhpEd . PhpEd cũng đi kèm với trình gỡ lỗi có thể cung cấp thông tin chi tiết hơn. (Trình gỡ lỗi PhpEd rất giống với xdebug và tích hợp trực tiếp vào trình chỉnh sửa để bạn sử dụng 1 chương trình để làm mọi thứ.)

Liên kết của Cartman cũng rất tốt: http://www.ibm.com/developerworks/l Library / os-debug /


25
2039 là giá trị của E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE. Xem docs.php.net/manual/en/errorfunc.constants.php
Gumbo

Tôi thích tùy chọn của tập tin .htaccess. Nó giúp tôi gỡ lỗi trong một khu vực không phải là một phần của trang web công cộng. Cảm ơn rất nhiều cho mẹo này!
jacekn

1
Tôi sẽ thêm rằng các lỗi đăng nhập vào tập tin (và tìm chúng ở đó) là giải pháp tốt nhất. Đừng dựa vào việc hiển thị lỗi trên trang - chúng có thể làm hỏng nó, bạn có thể quên bật báo cáo lỗi cho trang sản xuất và điều này sẽ gây rắc rối cho bạn trong tương lai
Ivan Yarych

455

Sau đây cho phép tất cả các lỗi:

ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);

Cũng xem các liên kết sau


28
Tốt nhất để thực hiện những thay đổi này ở cấp tệp .ini. Bật báo cáo lỗi từ trong tập lệnh là vô ích, vì nó sẽ không giúp ích cho các lỗi cú pháp hoặc các lỗi nghiêm trọng khác giết chết giai đoạn biên dịch. Kịch bản bị giết từ lâu trước khi bắt đầu thực thi và đạt được các ghi đè báo cáo.
Marc B

Bạn đúng là đúng. Tôi không nhận thấy rằng việc di chuyển là đến máy chủ của riêng bạn.
Eljakim

6
Chạy phpinfo () để tìm tệp php.ini chính xác. Tìm dòng Tệp cấu hình đã tải .
khủng khiếp

1
Nếu bạn đang tìm kiếm các lỗi xảy ra trong giai đoạn biên dịch, hãy kiểm tra nhật ký apache của bạn thường nằm ở /var/log/apache2/error.log
csi

1
Câu trả lời này sẽ thất bại trên php7 khi bật tính năng gõ nghiêm ngặt, bởi vì tham số thứ hai ini_setlà một chuỗi.
PeeHaa

175

Đoạn mã sau sẽ hiển thị tất cả các lỗi:

<?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last()))
    {
        return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array(
        0x0001 => 'E_ERROR',
        0x0002 => 'E_WARNING',
        0x0004 => 'E_PARSE',
        0x0008 => 'E_NOTICE',
        0x0010 => 'E_CORE_ERROR',
        0x0020 => 'E_CORE_WARNING',
        0x0040 => 'E_COMPILE_ERROR',
        0x0080 => 'E_COMPILE_WARNING',
        0x0100 => 'E_USER_ERROR',
        0x0200 => 'E_USER_WARNING',
        0x0400 => 'E_USER_NOTICE',
        0x0800 => 'E_STRICT',
        0x1000 => 'E_RECOVERABLE_ERROR',
        0x2000 => 'E_DEPRECATED',
        0x4000 => 'E_USER_DEPRECATED'
    );

    if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN';
    };

    return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message)));
};

$old_error_handler = set_error_handler("ErrorHandler");

// other php code

?>

Cách duy nhất để tạo một trang trống với mã này là khi bạn gặp lỗi trong trình xử lý tắt máy. Tôi đã sao chép và dán nó từ cms của riêng tôi mà không kiểm tra nó, nhưng tôi chắc chắn rằng nó hoạt động.


4
Tôi nhận được một trang trống từ mã đó. Ý bạn là gì khi "bạn có lỗi trong trình xử lý tắt máy" và tôi nên làm gì để giải quyết vấn đề?
Paolo M

@PaoloM, Ông đang nói một lỗi trong chức năng ShutdownHandlertrên. Về cơ bản đây là một hack stopgap thay cho việc xử lý lỗi thích hợp.
Pacerier

Cảm ơn, rất hữu ích, nhưng làm thế nào tôi có thể vô hiệu hóa E_NOTICElỗi trong chức năng này?
MajAfy

Đây là giải pháp phù hợp, nhưng hãy cẩn thận với việc tiết lộ thông tin khi xảy ra lỗi ... (thích đăng nhập thay vì lặp lại cho người dùng)
Sam Jason Braddock

1
Tôi đang sử dụng điều này khi Symfony không thể bắt lỗi chính xác.
COil

61

Lỗi và cảnh báo thường xuất hiện trong ....\logs\php_error.loghoặc ....\logs\apache_error.logtùy thuộc vào cài đặt php.ini của bạn.

Ngoài ra các lỗi hữu ích thường được chuyển đến trình duyệt, nhưng vì chúng không phải là html hợp lệ nên chúng không được hiển thị.

Vì vậy, "tail -f"tệp nhật ký của bạn và khi bạn có màn hình trống, hãy sử dụng các tùy chọn menu" xem "->" nguồn "của IE để xem đầu ra thô.


13
Đáng buồn thay, xem trang nguồn hiển thị không có gì quá.
Matthew Scharley

2
Lỗi phân tích cú pháp sẽ hiển thị trong nhật ký lỗi của Apache, bất kể bạn có cài đặt nào ở bất kỳ nơi nào khác. Nếu bạn không có quyền kiểm soát máy chủ thì việc ghi nhật ký lỗi apache có thể khó khăn, nhưng tôi khuyên bạn nên nói chuyện với nhà cung cấp của mình và có nhiều cách để tiết lộ nhật ký lỗi cho bạn. Ngoài ra, tôi chỉ có thể đề xuất những gì khác có - kiểm tra mã của bạn để phân tích lỗi trong máy chủ phát triển cục bộ của bạn trước khi bạn triển khai vào sản xuất. Ngoài ra, một IDE xác nhận hợp lệ như PDT của Eclipse có thể giúp ích rất nhiều.
Guss

5
Quay trở lại vấn đề này, gần đây tôi đã gặp sự cố tràn ngăn xếp không tạo ra bất kỳ lỗi nào, ngay cả trong nhật ký và không có biểu hiện như vậy cho đến khi tôi cài đặt xdebug vào máy chủ. Gah
Matthew Scharley

Nếu bạn không thể sửa đổi php.ini, hãy tạo tệp .htaccess có php_flag display_errors 1trong đó.
Tom

59

Bạn có thể bao gồm các dòng sau trong tệp bạn muốn gỡ lỗi:

error_reporting(E_ALL);
ini_set('display_errors', '1');

Điều này ghi đè cài đặt mặc định trong php.ini, điều này chỉ khiến PHP báo cáo lỗi cho nhật ký.


2
Đúng. Trong trường hợp này, các giá trị phải được đặt trực tiếp trong ini - đối với môi trường phát triển thuần túy, điều này có thể được ưu tiên hơn.
Tomalak

53

Cấu hình PHP

2 mục trong php.ini chỉ ra lỗi xuất hiện:

  1. display_errors
  2. error_reporting

Trong sản xuất , display_errorsthường được đặt thành Off(Đó là một điều tốt, vì hiển thị lỗi trong các trang web sản xuất thường không được mong muốn!).

Tuy nhiên, trong quá trình phát triển , nó nên được đặt thành On, để các lỗi được hiển thị. Kiểm tra !

error_reporting(kể từ PHP 5.3) được đặt theo mặc định thành E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(có nghĩa là, mọi thứ được hiển thị ngoại trừ các thông báo, tiêu chuẩn nghiêm ngặt và thông báo không dùng nữa). Khi nghi ngờ, hãy đặt nó E_ALLđể hiển thị tất cả các lỗi. Kiểm tra !

Whoa whoa! Không kiểm tra! Tôi không thể thay đổi php.ini của mình!

Thật là xấu hổ. Các máy chủ được chia sẻ thường không cho phép thay đổi tệp php.ini của họ và vì vậy, tùy chọn đó thật đáng buồn. Nhưng đừng sợ! Chúng tôi có các lựa chọn khác !

Cấu hình thời gian chạy

Trong tập lệnh mong muốn, chúng ta có thể thay đổi các mục php.ini trong thời gian chạy! Có nghĩa là, nó sẽ chạy khi tập lệnh chạy! Ngọt!

error_reporting(E_ALL);
ini_set("display_errors", "On");

Hai dòng này sẽ có tác dụng tương tự như thay đổi các mục php.ini như trên! Tuyệt vời!

Tôi vẫn nhận được một trang trống / 500 lỗi!

Điều đó có nghĩa là kịch bản thậm chí không chạy! Điều đó thường xảy ra khi bạn có một lỗi cú pháp!

Với lỗi cú pháp, tập lệnh thậm chí không được chạy. Nó không thành công tại thời gian biên dịch , nghĩa là nó sẽ sử dụng các giá trị trong php.ini, nếu bạn không thay đổi, có thể không cho phép hiển thị lỗi.

Nhật ký lỗi

Ngoài ra, PHP theo mặc định ghi nhật ký lỗi. Trong lưu trữ được chia sẻ, nó có thể nằm trong một thư mục chuyên dụng hoặc trên cùng thư mục với tập lệnh vi phạm.

Nếu bạn có quyền truy cập vào php.ini, bạn có thể tìm thấy nó trong error_logmục.


30

Có một tiện ích mở rộng thực sự hữu ích có tên là " xdebug " sẽ giúp báo cáo của bạn đẹp hơn rất nhiều.


2
Thật vậy, đây là một công cụ gỡ lỗi rất hữu ích, giúp các thông báo lỗi dài hơn nhiều, với các dấu vết ngăn xếp đầy đủ và các bãi chứa biến đổi và mọi thứ.
hbw

2
Đúng. Và sau đó sử dụng một cái gì đó như plugin VimDebugger để duyệt mã của bạn và tìm ra lỗi ở đâu.
Sander Marechal

1
NetBeans với xdebug tại đây. Thật tuyệt vời. Tôi mới sử dụng PHP (thường là ASP.NET) và đã phát hành các câu lệnh echo trước đây.
Một số Canuck

30

Tôi luôn luôn sử dụng cú pháp này ở đầu tập lệnh php.

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off

3
Tôi xin lỗi, nhưng -1 vì đã không đọc các câu trả lời khác đã được đăng. Điều này được quan tâm trong .htaccess như đã đề cập nhiều lần.
Matthew Scharley

12
"lưu trữ miễn phí" thông thường bỏ qua .htaccess
FDisk

27

Để xử lý sự cố nhanh chóng, thực tế, tôi thường đề xuất ở đây trên SO:

error_reporting(~0); ini_set('display_errors', 1);

được đặt ở phần đầu của kịch bản đang gặp sự cố. Điều này không hoàn hảo, biến thể hoàn hảo là bạn cũng cho phép trong php.iniđó và bạn ghi nhật ký các lỗi trong PHP để bắt lỗi cú pháp và lỗi khởi động.

Các cài đặt được nêu ở đây hiển thị tất cả các lỗi, thông báo và cảnh báo, bao gồm cả các lỗi nghiêm ngặt, bất kể phiên bản PHP nào.

Những điều tiếp theo cần xem xét:

  • Cài đặt Xdebug và cho phép gỡ lỗi từ xa với IDE của bạn.

Cũng xem:


27

Có thể đăng ký một hook để hiển thị lỗi hoặc cảnh báo cuối cùng.

function shutdown(){
  var_dump(error_get_last());
}

register_shutdown_function('shutdown');

thêm mã này vào đầu của bạn index.php sẽ giúp bạn gỡ lỗi các vấn đề.


1
Đây là vàng nguyên chất cho những người bị mắc kẹt trong các webhost không có lỗi nhưng cho phép truy cập nhật ký bằng không
Rafael Mena Barreto

18

Đây là một vấn đề của cấu hình được tải so với thời gian chạy

Điều quan trọng là phải nhận ra rằng lỗi cú pháp hoặc lỗi phân tích cú pháp xảy ra trong bước biên dịch hoặc phân tích cú pháp , điều đó có nghĩa là PHP sẽ bảo lãnh trước khi nó thậm chí có cơ hội thực thi bất kỳ mã nào của bạn. Vì vậy, nếu bạn đang sửa đổi display_errorscấu hình của PHP trong thời gian chạy, (điều này bao gồm mọi thứ từ việc sử dụng ini_setmã của bạn đến sử dụng .htaccess, là tệp cấu hình thời gian chạy) thì chỉ có các cài đặt cấu hình được tải mặc định được phát.

Làm thế nào để luôn tránh WSOD trong quá trình phát triển

Để tránh WSOD bạn muốn đảm bảo rằng tệp cấu hình đã tải của bạn đã display_errorsbật và error_reportingđược đặt thành -1( đây là E_ALL tương đương vì nó đảm bảo tất cả các bit được bật bất kể bạn đang chạy phiên bản PHP nào ). Không mã hóa giá trị không đổi của E_ALL, vì giá trị đó có thể thay đổi giữa các phiên bản khác nhau của PHP.

Cấu hình được tải là php.initệp được tải hoặc tệp của bạn apache.confhoặc httpd.confhoặc virtualhost. Các tệp đó chỉ được đọc một lần trong giai đoạn khởi động (ví dụ khi lần đầu tiên bạn bắt đầu apache httpd hoặc php-fpm) và chỉ bị ghi đè bởi thay đổi cấu hình thời gian chạy. Đảm bảo rằng display_errors = 1error_reporting = -1trong tệp cấu hình được tải của bạn đảm bảo rằng bạn sẽ không bao giờ thấy WSOD bất kể lỗi cú pháp hoặc phân tích cú pháp xảy ra trước khi thay đổi thời gian chạy như thế nào ini_set('display_errors', 1);hoặc error_reporting(E_ALL);có thể diễn ra.

Cách tìm tệp cấu hình được tải (php.ini) của bạn

Để xác định vị trí (các) tệp cấu hình đã tải của bạn, chỉ cần tạo một tệp PHP mới chỉ với mã sau đây ...

<?php
phpinfo();

Sau đó trỏ trình duyệt của bạn đến đó và xem Tệp cấu hình đã tảicác tệp .ini bổ sung được phân tích cú pháp , thường nằm ở đầu của bạn phpinfo()và sẽ bao gồm đường dẫn tuyệt đối đến tất cả các tệp cấu hình đã tải của bạn.

Nếu bạn thấy (none)thay vì tệp, điều đó có nghĩa là bạn không có Đường dẫn php.ini trong Tệp cấu hình (php.ini) . Vì vậy, bạn có thể tải xuống kho php.ini kèm theo PHP từ đây và sao chép nó vào đường dẫn tệp cấu hình của bạn dưới dạng php.ini, sau đó đảm bảo rằng người dùng php của bạn có đủ quyền để đọc từ tệp đó. Bạn sẽ cần khởi động lại httpd hoặc php-fpm để tải nó vào. Hãy nhớ rằng, đây là tệp php.ini phát triển đi kèm với nguồn PHP. Vì vậy, xin vui lòng không sử dụng nó trong sản xuất!


Chỉ không làm điều này trong sản xuất

Đây thực sự là cách tốt nhất để tránh WSOD trong quá trình phát triển. Bất cứ ai đề nghị bạn đặt ini_set('display_errors', 1);hoặc error_reporting(E_ALL);ở đầu tập lệnh PHP của bạn hoặc sử dụng .htaccess như bạn đã làm ở đây, sẽ không giúp bạn tránh WSOD khi xảy ra lỗi cú pháp hoặc phân tích cú pháp (như trong trường hợp của bạn ở đây) nếu tệp cấu hình được tải của bạn đã display_errorstắt

Nhiều người (và cài đặt chứng khoán của PHP) sẽ sử dụng tệp sản xuất đã display_errorstắt theo mặc định, điều này thường dẫn đến sự thất vọng tương tự mà bạn đã trải nghiệm ở đây. Bởi vì PHP đã tắt nó khi khởi động, sau đó gặp lỗi cú pháp hoặc phân tích cú pháp và không có gì để xuất. Bạn hy vọng rằng ini_set('display_errors',1);ở đầu tập lệnh PHP của bạn nên tránh điều đó, nhưng sẽ không có vấn đề gì nếu PHP không thể phân tích mã của bạn bởi vì nó sẽ không bao giờ đạt đến thời gian chạy.


17

Nếu bạn rất tuyệt, bạn có thể thử:

$test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192";

ini_set('display_errors',$test_server);
error_reporting(E_ALL|E_STRICT);

Điều này sẽ chỉ hiển thị lỗi khi bạn đang chạy cục bộ. Nó cũng cung cấp cho bạn biến test_server để sử dụng ở những nơi khác khi thích hợp.

Bất kỳ lỗi nào xảy ra trước khi chạy tập lệnh sẽ không bị bắt, nhưng với 99% lỗi tôi mắc phải, đó không phải là vấn đề.


2
Nếu bạn phân biệt giữa môi trường cục bộ và môi trường sản xuất, bạn chỉ cần bật hoặc tắt các lỗi trên toàn cầu (trong php.ini) và không phải là mã cũng có thể là mã sản xuất. Nếu bạn cần gỡ lỗi một trang web sản xuất trong môi trường sản xuất của nó và chỉ muốn bạn có thể xem các lỗi, hãy sử dụng $_SERVER['REMOTE_HOST']để kiểm tra xem máy khách có tốt không, bạn.
Jaap Haagmans

17

Trên đầu trang chọn một tham số

error_reporting(E_ERROR | E_WARNING | E_PARSE);

16

Để duy trì điều này và làm cho nó trở nên phức tạp, bạn có thể chỉnh sửa tệp php.ini của mình. Nó thường được lưu trữ trong /etc/php.inihoặc /etc/php/php.ini, nhưng nhiều địa phương hơn php.inicó thể ghi đè lên nó, tùy thuộc vào nguyên tắc thiết lập của nhà cung cấp dịch vụ lưu trữ của bạn. Kiểm tra một phpinfo()tệp cho Loaded Configuration Fileở trên cùng, để chắc chắn cái nào được tải cuối cùng.

Tìm kiếm display_errors trong tập tin đó. Chỉ nên có 3 trường hợp, trong đó có 2 trường hợp được bình luận.

Thay đổi dòng không ghi chú thành:

display_errors = stdout

16

Nếu nó sẽ giúp, nhưng đây là một phần của tệp cấu hình tiêu chuẩn của tôi cho các dự án php. Tôi có xu hướng không phụ thuộc quá nhiều vào cấu hình apache ngay cả trên máy chủ của riêng tôi.

Tôi không bao giờ có vấn đề lỗi biến mất, vì vậy có lẽ một cái gì đó ở đây sẽ cho bạn một ý tưởng.

Đã chỉnh sửa để hiển thị ỨNG DỤNG

/*
APPLICATION_LIVE will be used in process to tell if we are in a development or production environment.  It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
*/

if ( preg_match( "%^(www.)?livedomain.com$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', true);
} elseif ( preg_match( "%^(www.)?devdomain.net$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', false);
} else {
    die("INVALID HOST REQUEST (".$_SERVER["HTTP_HOST"].")");
    // Log or take other appropriate action.
}


/*
--------------------------------------------------------------------
DEFAULT ERROR HANDLING
--------------------------------------------------------------------
Default error logging.  Some of these may be changed later based on APPLICATION_LIVE.
*/
error_reporting(E_ALL & ~E_STRICT);
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");
ini_set ( "log_errors", 1);
ini_set ( "log_errors_max_len", 0);
ini_set ( "error_log", APPLICATION_ROOT."logs/php_error_log.txt");
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");

if ( ! APPLICATION_LIVE ) {
    // A few changes to error handling for development.
    // We will want errors to be visible during development.
    ini_set ( "display_errors", "1");
    ini_set ( "display_startup_errors", "1");
    ini_set ( "html_errors", "1");
    ini_set ( "docref_root", "http://www.php.net/");
    ini_set ( "error_prepend_string", "<div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'>");
    ini_set ( "error_append_string", "</div>");
}

@Eli, Điều này có một chi phí thời gian chạy mặc dù, mỗi yêu cầu trang .
Pacerier

lên 1 cho khái niệm bỏ qua cài đặt gỡ lỗi tuy nhiên máy chủ được định cấu hình, tốt trong khi bạn đang triển khai hoặc bảo trì (đang được phát triển)
justnajm

15
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

Ngoài ra, bạn có thể nhận thông tin chi tiết hơn với xdebug .


Xdebug có thể được kích hoạt từ php.ini
jewhuq

15

Tôi khuyên dùng Nette Tracy để trực quan hóa tốt hơn các lỗi và ngoại lệ trong PHP:

Ảnh chụp màn hình Nette Tracy


3
Tracy quan tâm đến việc thiết lập đúng tất cả các lỗi hiển thị và các tùy chọn báo cáo lỗi để cung cấp đầu ra trong các tình huống như được mô tả trong bài viết gốc ... Vì vậy, công cụ này đặc biệt hữu ích để giải quyết người hỏi "Có ai có thể giới thiệu các mẹo, công cụ và kỹ thuật gỡ lỗi PHP tốt không? ".
Jan Drábek

15
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


9

Bạn có thể đăng ký xử lý lỗi của riêng bạn trong PHP. Ví dụ, đổ tất cả các lỗi vào một tệp có thể giúp bạn trong những trường hợp tối nghĩa này. Lưu ý rằng chức năng của bạn sẽ được gọi, không có vấn đề gì hiện tại của bạn error_reporting được thiết lập để. Ví dụ rất cơ bản:

function dump_error_to_file($errno, $errstr) {
    file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');

7

Hai dòng chính bạn cần để nhận các lỗi hữu ích từ PHP là:

ini_set('display_errors',1);
 error_reporting(E_ALL);

Như được chỉ ra bởi những người đóng góp khác, những thứ này được tắt theo mặc định vì lý do bảo mật. Là một mẹo hữu ích - khi bạn thiết lập trang web của mình, thật tiện lợi để thực hiện chuyển đổi cho các môi trường khác nhau để các lỗi này được BẬT theo mặc định trong môi trường phát triển và cục bộ của bạn. Điều này có thể đạt được với đoạn mã sau (lý tưởng nhất là trong tệp index.php hoặc tệp cấu hình của bạn để mã này được kích hoạt từ đầu):

switch($_SERVER['SERVER_NAME'])
{
    // local
    case 'yourdomain.dev':
    // dev
    case 'dev.yourdomain.com':
        ini_set('display_errors',1);
        error_reporting(E_ALL);
    break;
    //live
    case 'yourdomain.com':
        //...
    break;
}

6

FirePHP cũng có thể hữu ích.


Tôi nên lưu ý FirePHP là một dự án đã chết vì FireBug được tích hợp vào Bảng điều khiển Firefox. ChromePHP là một trong những người kế nhiệm ở đó, nhưng không hoàn toàn.
Machavity

6

mở php.ini của bạn, đảm bảo nó được đặt thành:

display_errors = On

khởi động lại máy chủ của bạn.


6

Bạn cũng có thể muốn thử PHPStorm làm trình chỉnh sửa mã của mình. Nó sẽ tìm thấy nhiều lỗi PHP và các cú pháp khác ngay khi bạn đang gõ trình soạn thảo.


6

Nếu bạn là người dùng Ubuntu, hãy chọn thiết bị đầu cuối của bạn và chạy lệnh này

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

nơi nó sẽ hiển thị 50 lỗi gần đây. Có một tệp lỗi error.logcho apache2 ghi lại tất cả các lỗi.


5

Để bật báo cáo lỗi đầy đủ, hãy thêm phần này vào tập lệnh của bạn:

error_reporting(E_ALL);

Điều này gây ra thậm chí cảnh báo tối thiểu để hiển thị. Và, chỉ trong trường hợp:

ini_set('display_errors', '1');

Sẽ buộc hiển thị các lỗi. Điều này nên được tắt trong các máy chủ sản xuất, nhưng không phải khi bạn đang phát triển.


Như với câu trả lời của Tomalak, điều này không hoạt động đối với các lỗi cú pháp.
Darryl Hein

5

Các ERRORS LỚN là những điều hữu ích nhất để các nhà phát triển biết lỗi của họ và giải quyết chúng để làm cho hệ thống hoạt động hoàn hảo.

PHP cung cấp một số cách tốt hơn để biết các nhà phát triển tại sao và nơi đoạn mã của họ gặp lỗi, vì vậy bằng cách biết những lỗi đó, các nhà phát triển có thể làm cho mã của họ tốt hơn theo nhiều cách.

Cách tốt nhất để viết hai dòng trên đầu tập lệnh để nhận tất cả các thông báo lỗi:

error_reporting(E_ALL);
ini_set("display_errors", 1);

Một cách khác để sử dụng các công cụ gỡ lỗi như xdebug trong IDE của bạn.


4

Bạn có thể kích hoạt báo cáo lỗi đầy đủ (bao gồm các thông báo và tin nhắn nghiêm ngặt). Một số người thấy điều này quá dài dòng, nhưng nó đáng để thử. Đặt error_reportingđể E_ALL | E_STRICTtrong php.ini của bạn.

error_reporting = E_ALL | E_STRICT

E_STRICT sẽ thông báo cho bạn về các chức năng không dùng nữa và cung cấp cho bạn các đề xuất về các phương pháp tốt nhất để thực hiện một số tác vụ nhất định.

Nếu bạn không muốn thông báo, nhưng bạn thấy các loại tin nhắn khác hữu ích, hãy thử loại trừ các thông báo:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Cũng đảm bảo rằng nó display_errorsđược kích hoạt trong php.ini. Nếu phiên bản PHP của bạn cũ hơn 5.2.4, hãy đặt thành On:

display_errors = "On"

Nếu phiên bản của bạn là 5.2.4 trở lên, hãy sử dụng:

display_errors = "stderr"

4

Ngoài cài đặt error_Vporting và display_errors ini, bạn có thể nhận được các lỗi SYNTAX từ các tệp nhật ký của máy chủ web của bạn. Khi tôi đang phát triển PHP, tôi tải nhật ký máy chủ web của hệ thống phát triển vào trình soạn thảo của mình. Bất cứ khi nào tôi kiểm tra một trang và nhận được một màn hình trống, tệp nhật ký sẽ bị cũ và biên tập viên của tôi hỏi tôi có muốn tải lại không. Khi tôi làm, tôi nhảy xuống dưới và có lỗi cú pháp. Ví dụ:

[Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9

3

Đối với những người sử dụng nginx và có màn hình trắng ngay cả đối với tệp <?php echo 123;. Trong trường hợp của tôi, tôi không có tùy chọn bắt buộc này cho PHP trong tệp cấu hình nginx:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Tùy chọn này không có trong tệp fastcgi_params, vì vậy PHP không hoạt động và không có bất kỳ lỗi nào trong nhật ký.


Tôi gặp vấn đề tương tự và do tập tin cấu hình mặc định của Nginx thiếu dòng đó.
Salem
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.