คุณดีบักสคริปต์PHPอย่างไร
ฉันตระหนักถึงการดีบักพื้นฐานเช่นการใช้การรายงานข้อผิดพลาด การดีบักเบรกพอยต์ในPHPEclipseก็มีประโยชน์เช่นกัน
อะไรคือวิธีที่ดีที่สุด (ในแง่ของวิธีที่ง่ายและรวดเร็ว) ในการดีบักใน phpStorm หรือ IDE อื่น ๆ
คุณดีบักสคริปต์PHPอย่างไร
ฉันตระหนักถึงการดีบักพื้นฐานเช่นการใช้การรายงานข้อผิดพลาด การดีบักเบรกพอยต์ในPHPEclipseก็มีประโยชน์เช่นกัน
อะไรคือวิธีที่ดีที่สุด (ในแง่ของวิธีที่ง่ายและรวดเร็ว) ในการดีบักใน phpStorm หรือ IDE อื่น ๆ
คำตอบ:
ลองEclipse PDTเพื่อตั้งค่าสภาพแวดล้อม Eclipse ที่มีคุณสมบัติการดีบักอย่างที่คุณพูดถึง ความสามารถในการก้าวเข้าสู่โค้ดเป็นวิธีที่ดีกว่าในการดีบักวิธีเก่าของ var_dump และพิมพ์ตามจุดต่าง ๆ เพื่อดูว่าการไหลของคุณผิดไปอย่างไร เมื่อสิ่งอื่นล้มเหลวและทั้งหมดที่ฉันมีคือ SSH และกลุ่มฉันยังvar_dump()
/ die()
เพื่อค้นหาว่ารหัสไปทางทิศใต้
kill($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit; }
คุณสามารถใช้ Firephp ส่วนเสริมเพื่อ firebug เพื่อดีบัก php ในสภาพแวดล้อมเดียวกันกับ javascript
ฉันยังใช้Xdebug ที่กล่าวถึงก่อนหน้านี้สำหรับการทำโปรไฟล์ php
นี่คือสภาพแวดล้อมการแก้ปัญหาเล็กน้อยของฉัน:
error_reporting(-1);
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_BAIL, 0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, 'assert_callcack');
set_error_handler('error_handler');
set_exception_handler('exception_handler');
register_shutdown_function('shutdown_handler');
function assert_callcack($file, $line, $message) {
throw new Customizable_Exception($message, null, $file, $line);
}
function error_handler($errno, $error, $file, $line, $vars) {
if ($errno === 0 || ($errno & error_reporting()) === 0) {
return;
}
throw new Customizable_Exception($error, $errno, $file, $line);
}
function exception_handler(Exception $e) {
// Do what ever!
echo '<pre>', print_r($e, true), '</pre>';
exit;
}
function shutdown_handler() {
try {
if (null !== $error = error_get_last()) {
throw new Customizable_Exception($error['message'], $error['type'], $error['file'], $error['line']);
}
} catch (Exception $e) {
exception_handler($e);
}
}
class Customizable_Exception extends Exception {
public function __construct($message = null, $code = null, $file = null, $line = null) {
if ($code === null) {
parent::__construct($message);
} else {
parent::__construct($message, $code);
}
if ($file !== null) {
$this->file = $file;
}
if ($line !== null) {
$this->line = $line;
}
}
}
assert_callcack
heh
XDebugเป็นสิ่งจำเป็นสำหรับการพัฒนา ฉันติดตั้งก่อนส่วนขยายอื่น ๆ มันทำให้คุณมีร่องรอยสแต็กในข้อผิดพลาดใด ๆ และคุณสามารถเปิดใช้งานการทำโปรไฟล์ได้อย่างง่ายดาย
var_dump()
สำหรับดูอย่างรวดเร็วที่ใช้โครงสร้างข้อมูล อย่าใช้print_r()
เพราะคุณจะต้องล้อมรอบด้วย<pre>
และจะพิมพ์ทีละครั้งเท่านั้น
<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>
สำหรับสภาพแวดล้อมการดีบักที่ดีที่สุดที่ฉันพบคือKomodo IDEแต่ราคา $$
phpEd นั้นดีจริงๆ คุณสามารถเข้า / ออก / ฟังก์ชั่นได้ คุณสามารถเรียกใช้โค้ด ad-hoc ตรวจสอบตัวแปรเปลี่ยนตัวแปร มันวิเศษมาก
1) ฉันใช้ print_r () ใน TextMate ฉันมีตัวอย่างสำหรับ 'pre' ซึ่งขยายไปถึงสิ่งนี้:
echo "<pre>";
print_r();
echo "</pre>";
2) ฉันใช้ Xdebug แต่ไม่สามารถทำให้ GUI ทำงานได้บน Mac ของฉัน อย่างน้อยจะพิมพ์สแต็กการติดตามสแต็กรุ่นที่อ่านได้
echo '<pre>', print_r($var, true), '</pre>';
ฉันใช้สตูดิโอ Zend (5.5)พร้อมกับแพลตฟอร์ม Zendแล้ว ที่ให้การแก้จุดบกพร่องที่เหมาะสมเบรกพอยต์ / ก้าวข้ามรหัส ฯลฯ แม้ในราคา
ในความซื่อสัตย์ทั้งหมดการรวมกันของการพิมพ์และ print_r () เพื่อพิมพ์ตัวแปร ฉันรู้ว่าหลายคนชอบที่จะใช้วิธีการขั้นสูงอื่น ๆ แต่ฉันพบว่าวิธีนี้ใช้ง่ายที่สุด
ฉันจะบอกว่าฉันไม่ได้ชื่นชมสิ่งนี้อย่างเต็มที่จนกระทั่งฉันได้เขียนโปรแกรมไมโครโปรเซสเซอร์ที่ Uni และไม่สามารถใช้งานได้
Xdebugโดย Derick Rethans ดีมาก ฉันใช้มันเมื่อไม่นานมานี้และพบว่าไม่ใช่เรื่องง่ายที่จะติดตั้ง เมื่อคุณทำเสร็จแล้วคุณจะไม่เข้าใจวิธีการจัดการหากไม่มี :-)
มีบทความที่ดีเกี่ยวกับZend Developer Zone (การติดตั้งบน Linux ดูเหมือนจะไม่ง่ายขึ้น) และแม้แต่ปลั๊กอิน Firefoxซึ่งฉันไม่เคยใช้
ฉันใช้ Netbeans กับ XDebug ตรวจสอบที่เว็บไซต์เพื่อรับเอกสารเกี่ยวกับวิธีกำหนดค่า http://php.netbeans.org/
ฉันใช้ Netbeans กับ XDebug และEasy XDebug FireFox Add-on
โปรแกรมเสริมเป็นสิ่งจำเป็นเมื่อคุณทำการดีบักโครงการ MVC เนื่องจากวิธีปกติที่ XDebug ทำงานใน Netbeans คือการลงทะเบียนเซสชัน dbug ผ่านทาง url เมื่อติดตั้งส่วนเสริมใน FireFox คุณจะต้องตั้งค่าคุณสมบัติโครงการ Netbeans ของคุณ -> เรียกใช้ Configuratuion -> ขั้นสูงและเลือก "อย่าเปิดเว็บเบราว์เซอร์" ตอนนี้คุณสามารถกำหนดจุดพักและเริ่มเซสชันการดีบักด้วย Ctrl-F5 ตามปกติ . เปิด FireFox และคลิกขวาที่ไอคอน Add-on ที่มุมล่างขวาเพื่อเริ่มการตรวจสอบจุดพัก เมื่อรหัสถึงจุดพักมันจะหยุดและคุณสามารถตรวจสอบสถานะตัวแปรและ call-stack ของคุณ
การบัฟเฟอร์ออกมีประโยชน์มากถ้าคุณไม่ต้องการทำให้การส่งออกของคุณยุ่งเหยิง ฉันทำสิ่งนี้ในสายการบินเดียวซึ่งฉันสามารถแสดงความคิดเห็น / ไม่แสดงความคิดเห็นตามที่ประสงค์
ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();
PhpEdit มี debugger ในตัว แต่ปกติแล้วฉันจะใช้ echo (); และ print_r (); วิธีแบบเก่า !!
สำหรับปัญหาที่หนักหน่วงจริง ๆ ที่ใช้เวลานานเกินไปในการใช้ print_r / echo เพื่อหาว่าฉันใช้คุณสมบัติการดีบัก IDE (PhpEd) ของ IDE แล้ว แตกต่างจาก IDE อื่น ๆ ที่ฉันเคยใช้ PhpEd ไม่ต้องติดตั้งอะไรเลย เหตุผลเดียวที่ฉันไม่ใช้มันสำหรับปัญหาใด ๆ ที่ฉันพบคือความเจ็บปวดช้า ฉันไม่แน่ใจว่าความเชื่องช้านั้นจำเพาะกับ PhpEd หรือดีบักเกอร์ php ใด ๆ phpEd ไม่ฟรี แต่ฉันเชื่อว่ามันใช้หนึ่งใน debuggers โอเพนซอร์ส (เช่น XDebug ที่กล่าวถึงก่อนหน้า) ต่อไป ประโยชน์กับ PhpEd อีกครั้งคือมันไม่จำเป็นต้องติดตั้งซึ่งฉันพบว่าค่อนข้างน่าเบื่อในอดีต
การดีบักแบบแมนนวลนั้นเร็วสำหรับฉัน - var_dump()
และdebug_print_backtrace()
เป็นเครื่องมือทั้งหมดที่คุณต้องใช้ในการจัดวางตรรกะของคุณ
ดีขึ้นอยู่กับว่ามันจะไปทางไหน นั่นเป็นสิ่งแรกที่ฉันพยายามแยกจากนั้นฉันจะใช้ echo / print_r () ตามความจำเป็น
หมายเหตุ: พวกคุณรู้หรือไม่ว่าคุณสามารถส่งผ่านความจริงเป็นอาร์กิวเมนต์ที่สองเพื่อ print_r () และมันจะส่งกลับผลลัพธ์แทนการพิมพ์หรือไม่ เช่น:
echo "<pre>".print_r($var, true)."</pre>";
ฉันมักจะใช้ CakePHP เมื่อไม่สามารถใช้ Rails ได้ เพื่อแก้ไขข้อผิดพลาดฉันมักจะพบerror.log
ในโฟลเดอร์ tmp และหางใน terminal ด้วยคำสั่ง ...
tail -f app/tmp/logs/error.log
มันให้คุณใช้กล่องโต้ตอบจากเค้กของสิ่งที่เกิดขึ้นซึ่งเป็นประโยชน์มากถ้าคุณต้องการที่จะส่งออกบางสิ่งบางอย่างเพื่อมันรหัสกลางที่คุณสามารถใช้
$this->log('xxxx');
โดยปกติจะทำให้คุณมีความคิดที่ดีว่าเกิดอะไรขึ้น / ผิด
print_r (debug_backtrace ());
หรืออะไรทำนองนั้น :-)
Komodo IDE ทำงานได้ดีกับ xdebug แม้สำหรับการดีบัก remore ต้องการการกำหนดค่าขั้นต่ำ สิ่งที่คุณต้องมีคือรุ่นของ php ที่โคโมโดสามารถใช้ในพื้นที่เพื่อโค้ดผ่านจุดพัก หากคุณมีสคริปต์ที่นำเข้าสู่โครงการโคโมโดแล้วคุณสามารถตั้งค่าเบรกพอยต์ด้วยการคลิกเมาส์เพียงวิธีที่คุณจะตั้งไว้ใน eclipse สำหรับการแก้จุดบกพร่องโปรแกรมจาวา เห็นได้ชัดว่าการดีบักแบบรีโมตนั้นยุ่งยากกว่าเพื่อให้ทำงานได้อย่างถูกต้อง (คุณอาจต้องแม็พ URL ระยะไกลกับสคริปต์ php ในพื้นที่ทำงานของคุณ) กว่าการตั้งค่าการดีบักแบบโลคัลซึ่งค่อนข้างง่ายต่อการกำหนดค่าหากคุณใช้ MAC หรือ Linux .
Nusphere ยังเป็นดีบักเกอร์ที่ดีสำหรับ php nusphere
มีเทคนิคการดีบัก PHP มากมายที่สามารถช่วยคุณประหยัดเวลานับไม่ถ้วนเมื่อการเข้ารหัส เทคนิคการแก้จุดบกพร่องที่มีประสิทธิภาพ แต่พื้นฐานคือเพียงแค่เปิดการรายงานข้อผิดพลาด เทคนิคขั้นสูงอีกเล็กน้อยที่เกี่ยวข้องกับการใช้คำสั่งพิมพ์ซึ่งสามารถช่วยระบุข้อบกพร่องที่เข้าใจยากมากขึ้นโดยการแสดงสิ่งที่เกิดขึ้นจริงบนหน้าจอ PHPeclipse เป็นปลั๊กอิน Eclipse ที่สามารถเน้นข้อผิดพลาดทางไวยากรณ์ทั่วไปและสามารถใช้ร่วมกับดีบักเกอร์เพื่อตั้งจุดพัก
display_errors = Off
error_reporting = E_ALL
display_errors = On
และยังใช้
error_log();
console_log();
ในสภาพแวดล้อมการใช้งานจริงฉันบันทึกข้อมูลที่เกี่ยวข้องลงในบันทึกข้อผิดพลาดของเซิร์ฟเวอร์ด้วย error_log ()
ฉันใช้สตูดิโอ zend สำหรับ eclipse กับดีบักเกอร์ในตัว มันยังคงช้าเมื่อเทียบกับการดีบักด้วย eclipse pdt กับ xdebug หวังว่าพวกเขาจะแก้ไขปัญหาเหล่านั้นความเร็วได้ดีขึ้นกว่ารุ่นล่าสุด แต่ก็ยังคงต้องใช้เวลา 2-3 วินาที แถบเครื่องมือ zend firefox ทำให้ทุกอย่างเป็นเรื่องง่าย (แก้ไขหน้าถัดไปหน้าปัจจุบัน ฯลฯ ) นอกจากนี้ยังให้บริการผู้สร้างโปรไฟล์ที่จะวัดรหัสของคุณและจัดทำแผนภูมิวงกลมเวลาดำเนินการ ฯลฯ
ข้อผิดพลาดส่วนใหญ่นั้นสามารถพบได้ง่ายเพียงแค่ใส่var_dump
ตัวแปรหลักบางตัว แต่มันก็ขึ้นอยู่กับประเภทของแอพพลิเคชันที่คุณพัฒนา
สำหรับอัลกอริทึมที่ซับซ้อนยิ่งขึ้นฟังก์ชัน step / เบรกพอยต์ / นาฬิกามีประโยชน์มาก (หากไม่จำเป็น)
PHP Debugger แบบอินเทอร์แอกทีฟใช้งานเป็นโมดูล SAPI ซึ่งสามารถให้คุณควบคุมสภาพแวดล้อมได้อย่างสมบูรณ์โดยไม่กระทบต่อการทำงานหรือประสิทธิภาพของโค้ดของคุณ มันมีจุดมุ่งหมายที่จะเป็นแพลตฟอร์มการแก้ไขข้อบกพร่องที่มีน้ำหนักเบาและมีประสิทธิภาพและใช้งานง่ายสำหรับ PHP 5.4+ และได้จัดส่งไปพร้อมกับ PHP 5.6
คุณสมบัติรวมถึง:
ดูภาพหน้าจอ:
หน้าแรก: http://phpdbg.com/
นี่เป็นห้องสมุดที่ใช้งานง่ายมาก (จริง ๆ แล้วเป็นไฟล์) เพื่อดีบักสคริปต์ PHP ของคุณ
สิ่งเดียวที่คุณต้องทำคือการรวมไฟล์หนึ่งไฟล์ไว้ด้านล่าง (ที่จุดเริ่มต้นในรหัสของคุณ):
require('php_error.php');
\php_error\reportErrors();
จากนั้นข้อผิดพลาดทั้งหมดจะให้ข้อมูลเช่น backtrace บริบทรหัสอาร์กิวเมนต์ฟังก์ชันฟังก์ชันตัวแปรเซิร์ฟเวอร์เป็นต้นตัวอย่างเช่น
คุณสมบัติรวมถึง:
หน้าแรก: http://phperror.net/
GitHub: https://github.com/JosephLenton/PHP-Error
ทางแยกของฉัน (พร้อมการแก้ไขเพิ่มเติม): https://github.com/kenorb-contrib/PHP-Error
หากระบบของคุณรองรับการติดตาม DTrace แบบไดนามิก (ติดตั้งโดยค่าเริ่มต้นใน OS X) และ PHP ของคุณถูกคอมไพล์ด้วยโพรบ DTrace ที่เปิดใช้งาน ( --enable-dtrace
) ซึ่งควรเป็นค่าเริ่มต้นคำสั่งนี้สามารถช่วยคุณในการดีบักสคริปต์ PHP โดยไม่มีเวลา:
sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'
ดังนั้นเมื่อให้นามแฝงต่อไปนี้ถูกเพิ่มลงในไฟล์rcของคุณ(เช่น~/.bashrc
, ~/.bash_aliases
):
alias trace-php='sudo dtrace -qn "php*:::function-entry { printf(\"%Y: PHP function-entry:\t%s%s%s() in %s:%d\n\", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }"'
trace-php
คุณอาจติดตามสคริปต์ของคุณกับง่ายต่อการจำนามแฝง:
นี่คือสคริปต์ dtrace ขั้นสูงเพิ่มเติมเพียงบันทึกลงในdtruss-php.d
ไฟล์ทำให้สามารถchmod +x dtruss-php.d
เรียกใช้งานได้( ) และเรียกใช้:
#!/usr/sbin/dtrace -Zs
# See: https://github.com/kenorb/dtruss-lamp/blob/master/dtruss-php.d
#pragma D option quiet
php*:::compile-file-entry
{
printf("%Y: PHP compile-file-entry:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1));
}
php*:::compile-file-return
{
printf("%Y: PHP compile-file-return:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), basename(copyinstr(arg1)));
}
php*:::error
{
printf("%Y: PHP error message:\t%s in %s:%d\n", walltimestamp, copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::exception-caught
{
printf("%Y: PHP exception-caught:\t%s\n", walltimestamp, copyinstr(arg0));
}
php*:::exception-thrown
{
printf("%Y: PHP exception-thrown:\t%s\n", walltimestamp, copyinstr(arg0));
}
php*:::execute-entry
{
printf("%Y: PHP execute-entry:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}
php*:::execute-return
{
printf("%Y: PHP execute-return:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}
php*:::function-entry
{
printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::function-return
{
printf("%Y: PHP function-return:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}
php*:::request-shutdown
{
printf("%Y: PHP request-shutdown:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}
php*:::request-startup
{
printf("%Y, PHP request-startup:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}
หน้าแรก: dtruss-lampที่ GitHub
นี่คือการใช้งานที่เรียบง่าย:
sudo dtruss-php.d
เรียกใช้:php -r "phpinfo();"
.เพื่อทดสอบว่าคุณสามารถไปที่ docroot ด้วยindex.php
และเรียกใช้เซิร์ฟเวอร์ PHP builtin โดย:
php -S localhost:8080
หลังจากนั้นคุณสามารถเข้าถึงไซต์ได้ที่http: // localhost: 8080 / (หรือเลือกพอร์ตใดก็ได้ที่คุณสะดวก) จากตรงนั้นเข้าถึงบางหน้าเพื่อดูผลลัพธ์การติดตาม
หมายเหตุ: DTrace สามารถใช้ได้บน OS X โดยค่าเริ่มต้นบน Linux คุณอาจจำเป็นต้องdtrace4linuxหรือตรวจสอบอื่น ๆ บางทางเลือก
ดู: การใช้ PHP และ DTraceที่ php.net
หรือตรวจสอบการติดตาม SystemTap โดยติดตั้งแพ็คเกจพัฒนา SystemTap SDT (เช่นyum install systemtap-sdt-devel
)
นี่คือตัวอย่างสคริปต์ ( all_probes.stp
) สำหรับการติดตามจุดโพรบสแตติก PHP หลักทั้งหมดตลอดระยะเวลาของสคริปต์ PHP ที่รันด้วย SystemTap:
probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
printf("Probe compile__file__entry\n");
printf(" compile_file %s\n", user_string($arg1));
printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
printf("Probe compile__file__return\n");
printf(" compile_file %s\n", user_string($arg1));
printf(" compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
printf("Probe error\n");
printf(" errormsg %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
printf("Probe exception__caught\n");
printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
printf("Probe exception__thrown\n");
printf(" classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
printf("Probe execute__entry\n");
printf(" request_file %s\n", user_string($arg1));
printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
printf("Probe execute__return\n");
printf(" request_file %s\n", user_string($arg1));
printf(" lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
printf("Probe function__entry\n");
printf(" function_name %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
printf(" classname %s\n", user_string($arg4));
printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
printf("Probe function__return: %s\n", user_string($arg1));
printf(" function_name %s\n", user_string($arg1));
printf(" request_file %s\n", user_string($arg2));
printf(" lineno %d\n", $arg3);
printf(" classname %s\n", user_string($arg4));
printf(" scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
printf("Probe request__shutdown\n");
printf(" file %s\n", user_string($arg1));
printf(" request_uri %s\n", user_string($arg2));
printf(" request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
printf("Probe request__startup\n");
printf(" file %s\n", user_string($arg1));
printf(" request_uri %s\n", user_string($arg2));
printf(" request_method %s\n", user_string($arg3));
}
การใช้งาน:
stap -c 'sapi/cli/php test.php' all_probes.stp
ดู: การใช้ SystemTap กับ PHP DTrace Static Probesที่ php.net
+1 สำหรับ print_r () ใช้มันเพื่อทิ้งเนื้อหาของวัตถุหรือตัวแปร หากต้องการทำให้อ่านง่ายขึ้นให้ทำด้วยแท็กล่วงหน้าเพื่อให้คุณไม่จำเป็นต้องดูแหล่งที่มา
echo '<pre>';
print_r($arrayOrObject);
นอกจากนี้ยังมี var_dump ($ สิ่งของ) - มันมีประโยชน์มากในการดูประเภทของสิ่งย่อย
ฉันชอบชุดของ error_reporting (E_ALL) ผสมกับการทดสอบ echo (เพื่อหาข้อผิดพลาดที่เกิดขึ้นบรรทัด / ไฟล์ข้อผิดพลาดที่เกิดขึ้นในตอนแรกคุณรู้หรือไม่ว่า php สาย / ไฟล์บอกคุณใช่ไหม?) การจับคู่ IDE วงเล็บปีกกา (เพื่อแก้ไข "ข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดทางไวยากรณ์, ปัญหา $ end" ที่ไม่คาดคิด) และ print_r (); ออกจาก; ดัมพ์ (โปรแกรมเมอร์จริงดูที่ซอร์ส; p)
คุณไม่สามารถเอาชนะ phpdebug (ตรวจสอบซอร์สโค้ด) ด้วย "memory_get_usage ();" และ "memory_get_peak_usage ();" เพื่อค้นหาพื้นที่ที่มีปัญหา
ตัวดีบั๊กแบบรวมที่คุณสามารถดูค่าของการเปลี่ยนแปลงตัวแปรเมื่อคุณก้าวผ่านโค้ดนั้นยอดเยี่ยมจริงๆ อย่างไรก็ตามต้องมีการตั้งค่าซอฟต์แวร์บนเซิร์ฟเวอร์และการกำหนดค่าจำนวนหนึ่งบนไคลเอนต์ ทั้งสองอย่างนี้ต้องการการบำรุงรักษาเป็นระยะเพื่อให้ทำงานได้ดี
print_r นั้นง่ายต่อการเขียนและรับประกันว่าจะทำงานในการตั้งค่าใด ๆ
ฉันมักจะพบว่าสร้างฟังก์ชั่นบันทึกที่กำหนดเองที่สามารถบันทึกในไฟล์จัดเก็บข้อมูลการแก้ปัญหาและในที่สุดก็พิมพ์อีกครั้งบนส่วนท้ายที่พบบ่อย
คุณยังสามารถแทนที่คลาส Exception ทั่วไปเพื่อให้การดีบักประเภทนี้เป็นแบบกึ่งอัตโนมัติ