จะพิมพ์บันทึกการแก้ไขข้อบกพร่องได้อย่างไร


130

ฉันต้องการดีบักโค้ด PHP แต่ฉันคิดว่าการพิมพ์บันทึกเข้าสู่หน้าจอหรือไฟล์นั้นดีสำหรับฉัน

ฉันจะพิมพ์บันทึกในโค้ด PHP ได้อย่างไร

ปกติprint/ printfดูเหมือนจะไปที่เอาต์พุต HTML ไม่ใช่คอนโซล

ฉันมีเซิร์ฟเวอร์ Apache ที่รันโค้ด PHP


สคริปต์ของคุณกำลังทำงานในเว็บเบราว์เซอร์หรือในคอนโซล (หรือที่แยกวิเคราะห์โดยใช้ php.exe แทนที่จะเป็น apache / iis)
danielrsmith

คุณควรดูคำถามนี้มีรหัสบันทึกที่มีประโยชน์เล็กน้อย: stackoverflow.com/questions/5769537/…
เบ็น

คุณมาจากภาษาอะไร ดังนั้น php ของคุณจึงแตกต่างจากภาษาคอมไพล์อื่น ๆ มาก
Ibu

1
@lbu: แน่นอน .. ฉันไม่คาดคิดว่าprintfคำถามจะได้รับการโหวตมากมายขนาดนี้ ...
eugene

error_log ($ สตริง);
Thewebus

คำตอบ:


186

เคล็ดลับที่ไม่ค่อยมีใครรู้จักคือ mod_php จับคู่ stderr กับบันทึก Apache และมีสตรีมสำหรับสิ่งนั้นดังนั้นfile_put_contents('php://stderr', print_r($foo, TRUE))จะถ่ายโอนค่า$fooลงในบันทึกข้อผิดพลาดของ Apache


1
+ สำหรับการกล่าวถึงว่า btw คุณยังสามารถตั้งค่าของ error_log เป็น 'php: // stdout' เมื่อทำการดีบักแอปคอนโซลและมีข้อความแสดงข้อผิดพลาดปรากฏตรงไปที่คอนโซลนั่นคือ: error_log ("You messed up!", 3 , "php: // stdout");
stefgosselin

4
+1 ฉันใช้เวลานานเกินไปในการค้นหาคำตอบนี้ นี่คือทั้งหมดที่ฉันกำลังมองหา ฉันคิดไม่ออกว่าจะดูอาร์เรย์ของฉันได้อย่างไร (ทำงานใน Drupal)
SteveS

ฉันขอแนะนำให้ใช้var_export($foo, true)แทนprint_r($foo, true)if print_rไม่ได้รับข้อมูลประเภทที่คุณต้องการ
เบ็น

จะไม่เหมือนกับ error_log (print_r ($ foo)); ?
Brunis

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

อาจมีประโยชน์


2
น่าเสียดายที่นี่เป็นทางออกที่สะดวกที่สุด Xdebug มีความหนักในการเรียกใช้ตลอดเวลา โหวตให้คุณ
Phung D. An

26

คุณสามารถใช้error_logเพื่อส่งไฟล์บันทึกข้อผิดพลาดไปยังเซิร์ฟเวอร์ของคุณ (หรือไฟล์อื่นที่เป็นทางเลือกก็ได้หากคุณต้องการ)


21

หากคุณใช้ Linux:

file_put_contents('your_log_file', 'your_content');

หรือ

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

แล้วในคอนโซล

tail -f your_log_file

ซึ่งจะแสดงบรรทัดสุดท้ายอย่างต่อเนื่องในไฟล์


9

คุณต้องเปลี่ยนกรอบความคิดของคุณ คุณกำลังเขียน PHP ไม่ใช่อย่างอื่นที่คุณคุ้นเคยในการเขียน การดีบักใน PHP ไม่ได้ทำในสภาพแวดล้อมคอนโซล

ใน PHP คุณมีโซลูชันการดีบัก 3 ประเภท:

  1. เอาต์พุตไปยังเว็บเพจ (ดูไลบรารี dBug สำหรับมุมมองที่ดีกว่าของสิ่งต่างๆ)
  2. เขียนลงในล็อกไฟล์
  3. ในเซสชันการดีบักด้วย xDebug

เรียนรู้ที่จะใช้สิ่งเหล่านี้แทนที่จะพยายามทำให้ PHP ทำงานเหมือนภาษาอื่น ๆ ที่คุณคุ้นเคย


31
ในฐานะที่เป็นคนที่ใช้เวลาเขียนแอปคอนโซลและสคริปต์ที่ไม่ใช่เว็บต่างๆมากมายฉันจะไม่เห็นด้วยอย่างสุภาพ
stefgosselin

ฉันทำงานอย่างมากในการดูแลรักษาและพัฒนาแอปพลิเคชันคอนโซลและในการตีความคำถามภาษาอังกฤษที่ไม่ดีของฉันได้สันนิษฐานว่าเขากำลังต้องการดีบักแอปคอนโซล Xdebug นั้นดีและมีประโยชน์มากแม้ว่าฉันจะชอบการดีบักข้อมูลในตัวแก้ไขของฉัน
stefgosselin

1
@Stefgosselin: Netbeans ก็ทำได้เหมือนกันแม้ว่าสิ่งที่ดีที่สุดที่ฉันเคยเห็นกับ xDebug คือกับ Aptana
Sylverdrag

1
ฉันใช้ xDebug บน Netbeans และทำงานได้ดีเกือบตลอดเวลา แต่มีบางครั้งที่คุณต้องบันทึกข้อมูลต่างๆในไฟล์
cosan

ลองทำดูสิ.. คุณจะทำอะไรได้มากกว่านี้! stackoverflow.com/a/44050914/2053479
ganesh

5

คุณกำลังแก้ไขข้อบกพร่องบนคอนโซลหรือไม่? มีตัวเลือกมากมายสำหรับการดีบัก PHP ฟังก์ชั่นที่ใช้บ่อยที่สุดสำหรับการแก้จุดบกพร่องได้อย่างรวดเร็วและสกปรกvar_dump

ถูกพูดถึงและไม่ถูกต้องแม้ว่า var_dump จะยอดเยี่ยมและผู้คนจำนวนมากทำทุกอย่างด้วยสิ่งนั้น แต่ก็มีเครื่องมือและเทคนิคอื่น ๆที่สามารถเพิ่มสีสันได้เล็กน้อย

สิ่งที่จะช่วยได้หากทำการดีบักในหน้าเว็บให้ห่อ <pre> </pre>แท็กรอบคำสั่งการถ่ายโอนข้อมูลของคุณเพื่อให้คุณจัดรูปแบบอาร์เรย์และวัตถุได้อย่างเหมาะสม

เช่น:

<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>

และสุดท้าย แต่ไม่ท้ายสุดตรวจสอบให้แน่ใจว่าการดีบักการจัดการข้อผิดพลาดของคุณถูกตั้งค่าให้แสดงข้อผิดพลาดหรือไม่ อาจจำเป็นต้องเพิ่มสิ่งนี้ที่ด้านบนสุดของสคริปต์หากคุณไม่สามารถเข้าถึงการกำหนดค่าเซิร์ฟเวอร์ได้

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

โชคดี!


2

หากคุณไม่ต้องการรวมกรอบเช่นZendคุณสามารถใช้วิธีtrigger_errorเพื่อเข้าสู่บันทึกข้อผิดพลาด php


2

วิธีง่ายๆคือ trigger_error:

 trigger_error("My error");

แต่คุณไม่สามารถใส่อาร์เรย์หรือวัตถุได้ดังนั้นจึงใช้

var_dump

trigger_error น่าจะเป็นวิธีที่ดีที่สุดในการเขียนบันทึกข้อผิดพลาดของคุณ คุณจะขอบคุณตัวเองเมื่อคุณต้องการแก้ไขบอกว่าบรรทัดบันทึกพร้อมข้อมูลที่กำหนดเองในภายหลัง
Anshul

2

คุณยังสามารถเขียนลงในไฟล์เช่นนี้:

$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();

ตรวจสอบให้แน่ใจว่าได้ตั้งค่าสิทธิ์ที่เหมาะสมเพื่อให้ php สามารถเข้าถึงและเขียนลงในไฟล์ ( 775) ได้


1

คุณสามารถใช้โมดูล PHP ขดโทรไปยังhttp://liveoutput.com/ สิ่งนี้ใช้งานได้ดีในสภาพแวดล้อมขององค์กรที่ปลอดภัยซึ่งมีข้อ จำกัด บางประการใน php.ini ที่ จำกัด การใช้งานfile_put_contentsไฟล์.


1

นี่เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการดีบัก & บันทึก php: PHp Debugger & Logger

ใช้งานได้ทันทีด้วยรหัสเพียง 3 บรรทัด สามารถส่งข้อความไปยังคอนโซล js สำหรับการดีบัก ajax และสามารถแทนที่ตัวจัดการข้อผิดพลาด นอกจากนี้ยังทิ้งข้อมูลเกี่ยวกับตัวแปรเช่น var_dump () และ print_r () แต่อยู่ในรูปแบบที่อ่านง่ายกว่า เครื่องมือที่ดีมาก!


1

ฉันใช้สิ่งเหล่านี้มามากมาย แต่โดยปกติแล้วฉันจะต้องดีบักเมื่อพัฒนาและตั้งแต่ฉันพัฒนาบน localhost ฉันได้ทำตามคำแนะนำของผู้อื่นและตอนนี้เขียนลงในคอนโซลดีบัก JavaScript ของเบราว์เซอร์ (ดูที่http: //www.codeforest net / debugging-php-in-browser-javascript-console )

นั่นหมายความว่าฉันสามารถดูหน้าเว็บที่ PHP ของฉันสร้างขึ้นในเบราว์เซอร์ของฉันและกด F12 เพื่อแสดง / ซ่อนการติดตามการแก้ปัญหาอย่างรวดเร็ว

เนื่องจากฉันดูเครื่องมือสำหรับนักพัฒนาสำหรับดีบักเกอร์เลย์เอาต์ CSS และอื่น ๆ อยู่ตลอดเวลาจึงควรดูที่ Loggon PHP ของฉันที่นั่น

ถ้าใครตัดสินใจกับเราว่ารหัสนั้นฉันได้ทำการเปลี่ยนแปลงเล็กน้อย หลังจาก

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

ฉันเพิ่ม

$name = 'PHP: ' . $name;

นี่เป็นเพราะ PHP ฝั่งเซิร์ฟเวอร์ของฉันสร้าง HTML conatining JavaScript และฉันพบว่ามีประโยชน์ในการแยกแยะระหว่างเอาต์พุตจาก PHP และ JS

(หมายเหตุ: ฉันกำลังอัปเดตสิ่งนี้เพื่อให้ฉันสามารถเปิดและปิดประเภทเอาต์พุตต่างๆ: จาก PHP, จาก JS และการเข้าถึงฐานข้อมูล)



0

คุณสามารถใช้ได้:

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

2
สิ่งนี้มีค่าใช้จ่ายมาก เหตุใดจึงต้องเรียกใช้จาวาสคริปต์สำหรับเอาต์พุตข้อผิดพลาดธรรมดา
clockw0rk

-8

คุณสามารถใช้ได้

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

หรือหากคุณต้องการพิมพ์คำสั่งนั้นในบันทึกคุณสามารถใช้ได้

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

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