Làm thế nào để in một bản ghi gỡ lỗi?


129

Tôi muốn gỡ lỗi một số mã PHP, nhưng tôi đoán việc in nhật ký ra màn hình hoặc tệp là tốt đối với tôi.

Làm thế nào tôi nên in một bản ghi trong mã PHP?

Thông thường print/ printfdường như đi đến đầu ra HTML không phải bàn điều khiển.

Tôi có máy chủ Apache đang thực thi mã PHP.


Tập lệnh của bạn đang chạy trong trình duyệt web hay trong bảng điều khiển (còn được phân tích cú pháp bằng php.exe chứ không phải apache / iis)?
danielrsmith

Bạn nên xem câu hỏi này, có một chút mã đăng nhập hữu ích: stackoverflow.com/questions/5769537/ mẹo
Ben

bạn đến từ ngôn ngữ nào Vì vậy, php của bạn rất khác so với các ngôn ngữ được biên dịch khác
Ibu

1
@lbu: thực sự .. tôi không mong đợi, printfcâu hỏi sẽ nhận được nhiều sự ủng hộ này ...
eugene

error_log (chuỗi $);
Thewebus

Câu trả lời:


186

Một mẹo ít được biết đến là mod_php ánh xạ stderr vào nhật ký Apache. Và, có một luồng cho điều đó, vì vậy file_put_contents('php://stderr', print_r($foo, TRUE))sẽ kết xuất giá trị của $foobản ghi lỗi Apache một cách độc đáo .


1
+ đã đề cập đến điều đó, btw bạn cũng có thể đặt giá trị của error_log thành 'php: // stdout' khi gỡ lỗi một ứng dụng bảng điều khiển và có thông báo lỗi xuất hiện trực tiếp trên bảng điều khiển, ví dụ: error_log ("Bạn đã làm hỏng!", 3 , "php: // thiết bị xuất chuẩn");
stefgosselin

4
+1 Tôi mất quá nhiều thời gian để tìm câu trả lời này. Đây là tất cả những gì tôi thực sự đang tìm kiếm. Tôi không thể tìm ra làm thế nào để xem mảng của tôi chứa gì (hoạt động trong Drupal).
SteveS

Tôi cũng sẽ đề nghị sử dụng var_export($foo, true)thay vì print_r($foo, true)nếu print_rkhông cung cấp cho bạn thông tin loại bạn cần.
Bến

Sẽ không giống như error_log (print_r ($ foo)); ?
Brunis

143
error_log(print_r($variable, TRUE)); 

có thể hữu ích


2
Thật không may, đây là giải pháp thuận tiện nhất. Xdebug là nặng để chạy nó mọi lúc. Bình chọn cho bạn
Phụng D.

26

Bạn có thể sử dụng error_log để gửi đến tệp nhật ký lỗi máy chủ của bạn (hoặc một tệp khác tùy chọn nếu bạn muốn)


21

Nếu bạn đang dùng Linux:

file_put_contents('your_log_file', 'your_content');

hoặc là

error_log ('your_content', 3, 'your_log_file');

và sau đó trong giao diện điều khiển

tail -f your_log_file

Điều này sẽ hiển thị liên tục dòng cuối cùng được đặt trong tập tin.


9

Bạn cần thay đổi khung tâm trí của bạn. Bạn đang viết PHP, không phải bất cứ điều gì khác mà bạn đã từng viết. Gỡ lỗi trong PHP không được thực hiện trong môi trường giao diện điều khiển.

Trong PHP, bạn có 3 loại giải pháp gỡ lỗi:

  1. Xuất ra một trang web (xem thư viện dBug để có cái nhìn đẹp hơn về mọi thứ).
  2. Ghi vào một tệp nhật ký
  3. Trong phiên gỡ lỗi với xDebug

Học cách sử dụng những ngôn ngữ đó thay vì cố gắng làm cho PHP hoạt động như bất kỳ ngôn ngữ nào khác mà bạn quen sử dụng.


31
Là một người dành nhiều thời gian để viết các ứng dụng bảng điều khiển và các tập lệnh phi web khác nhau , tôi sẽ không đồng ý với điều đó.
stefgosselin

Tôi làm việc rất nhiều trong việc duy trì và phát triển các ứng dụng bảng điều khiển và theo cách hiểu tiếng Anh của tôi về câu hỏi đã cho rằng anh ta đang tìm cách gỡ lỗi một ứng dụng bảng điều khiển. Xdebug vẫn ổn và rất tiện dụng mặc dù tôi thích gỡ lỗi thông tin ngay trong trình soạn thảo của mình
stefgosselin

1
@Stefgosselin: Netbeans thực hiện khá giống nhau, mặc dù điều tốt nhất tôi thấy với xDebug là với Aptana.
Sylverdrag

1
Tôi sử dụng xDebug trên Netbeans và nó hoạt động tốt hầu hết thời gian. Nhưng, có những lúc bạn cần phải đăng nhập vào một tập tin.
cosan

hãy thử những điều này nữa..bạn sẽ có thể làm nhiều hơn nữa! stackoverflow.com/a/44050914/2053479
ganesh

5

Bạn đang gỡ lỗi trên console? Có nhiều tùy chọn để gỡ lỗi PHP. Hàm phổ biến nhất được sử dụng để gỡ lỗi nhanh & bẩn là var_dump .

Điều đó đang được nói và ra khỏi đó, mặc dù var_dump là tuyệt vời và rất nhiều người làm mọi thứ chỉ với điều đó, có những công cụ và kỹ thuật khác có thể làm gia vị nó lên một chút.

Những điều cần giúp đỡ nếu gỡ lỗi trong một trang web, bọc <pre> </pre>các thẻ xung quanh câu lệnh kết xuất của bạn để cung cấp cho bạn định dạng phù hợp trên mảng và đối tượng.

I E:

<div> some html code ....
      <a href="<?php $tpl->link;?>">some link to test</a>
</div>

      dump $tpl like this:

    <pre><?php var_dump($tpl); ?></pre>

Và, cuối cùng nhưng không kém phần chắc chắn nếu gỡ lỗi xử lý lỗi của bạn được đặt thành hiển thị lỗi. Thêm phần này vào đầu tập lệnh của bạn có thể cần thiết nếu bạn không thể truy cập cấu hình máy chủ để làm như vậy.

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

Chúc may mắn!


2

Nếu bạn không muốn tích hợp một khung như Zend , thì bạn có thể sử dụng phương thức trigger_error để đăng nhập vào nhật ký lỗi php.


2

Cách đơn giản là trigger_error:

 trigger_error("My error");

nhưng bạn không thể đặt mảng hoặc đối tượng do đó sử dụng

var_dump

trigger_error có lẽ là cách tốt nhất để ghi vào nhật ký lỗi của bạn. Bạn sẽ cảm ơn chính mình khi bạn muốn sửa đổi nói các dòng nhật ký với một số dữ liệu tùy chỉnh sau này.
Anshul

2

Bạn cũng có thể ghi vào một tập tin như thế này:

$logFilePath = '../logs/debug.text';
ob_start();

// if you want to concatenate:
if (file_exists($logFilePath)) {
    include($logFilePath);
}
// for timestamp
$currentTime = date(DATE_RSS);

// echo log statement(s) here
echo "\n\n$currentTime - [log statement here]";

$logFile = fopen($logFilePath, 'w');
fwrite($logFile, ob_get_contents());
fclose($logFile);
ob_end_flush();

Đảm bảo các quyền thích hợp được đặt để php có thể truy cập và ghi vào tệp ( 775).


1

Bạn có thể sử dụng mô-đun php curl để thực hiện cuộc gọi đến http://liveoutput.com/ . Điều này hoạt động rất tốt trong một môi trường công ty, an toàn nơi có các hạn chế nhất định trong php.ini tồn tại hạn chế sử dụng file_put_contents.


1

Đây là một công cụ tuyệt vời để gỡ lỗi và ghi nhật ký php: PHp Debugger & Logger

Nó hoạt động ngay lập tức với chỉ 3 dòng mã. Nó có thể gửi tin nhắn đến bảng điều khiển js để gỡ lỗi ajax và có thể thay thế trình xử lý lỗi. Nó cũng bỏ thông tin về các biến như var_dump () và print_r (), nhưng ở định dạng dễ đọc hơn. Công cụ rất đẹp!


1

Tôi đã sử dụng nhiều trong số này, nhưng vì tôi thường cần gỡ lỗi khi phát triển và vì tôi phát triển trên localhost, tôi đã làm theo lời khuyên của người khác và bây giờ viết thư cho bảng điều khiển gỡ lỗi JavaScript của trình duyệt (xem http: //www.codeforest. net / debugging-php-in-browser-javascript-console ).

Điều đó có nghĩa là tôi có thể xem trang web mà PHP của tôi đang tạo trong trình duyệt của tôi và nhấn F12 để nhanh chóng hiển thị / ẩn bất kỳ dấu vết gỡ lỗi nào.

Vì tôi liên tục nhìn vào các công cụ dành cho nhà phát triển để gỡ lỗi, bố cục CSS, v.v., nên nhìn vào biểu đồ PHP của tôi ở đó là hợp lý.

Nếu bất cứ ai quyết định cho chúng tôi mã đó, tôi đã thực hiện một thay đổi nhỏ. Sau

function debug($name, $var = null, $type = LOG) {

Tôi đã thêm

$name = 'PHP: ' . $name;

Điều này là do PHP phía máy chủ của tôi tạo ra JavaScript kết hợp HTML và tôi thấy thật hữu ích khi phân biệt giữa đầu ra với PHP & JS.

(Lưu ý: Tôi hiện đang cập nhật điều này để cho phép tôi bật và tắt các loại đầu ra khác nhau: từ PHP, từ JS và truy cập cơ sở dữ liệu)


1

Tôi sử dụng cakephp vì vậy tôi sử dụng:

$this->log(YOUR_STRING_GOES_HERE, 'debug');

0

Bạn có thể dùng:

<?php
echo '<script>console.log("debug log")</script>';
?>

2
cái này có nhiều chi phí Tại sao gọi javascript cho một đầu ra lỗi đơn giản?
clockw0rk

-8

Bạn có thể dùng

<?php
{
    AddLog("anypage.php","reason",ERR_ERROR);
}
?>

hoặc nếu bạn muốn in câu lệnh đó trong nhật ký, bạn có thể sử dụng

AddLog("anypage.php","string: ".$string,ERR_DEBUG_LOW);

8
Thêm nhật ký? Đây không phải là một chức năng bản địa.
stefgosselin
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.