Trình gỡ lỗi PHP bước tương tác được triển khai như một mô-đun SAPI có thể cung cấp cho bạn quyền kiểm soát hoàn toàn đối với môi trường mà không ảnh hưởng đến chức năng hoặc hiệu suất của mã của bạn. Nó nhằm mục đích trở thành một nền tảng gỡ lỗi nhẹ, mạnh mẽ, dễ sử dụng cho PHP 5.4+ và nó được vận chuyển ngoài luồng với PHP 5.6.
Các tính năng bao gồm:
- Gỡ lỗi từng bước
- Điểm dừng linh hoạt (Phương thức lớp, Chức năng, Tệp: Dòng, Địa chỉ, Opcode)
- Dễ dàng truy cập PHP với eval () tích hợp
- Dễ dàng truy cập vào mã hiện hành
- API người dùng
- Bất khả tri SAPI - Tích hợp dễ dàng
- Hỗ trợ tệp cấu hình PHP
- JIT Super Globals - Thiết lập của riêng bạn !!
- Hỗ trợ đọc đường dẫn tùy chọn - Vận hành thiết bị đầu cuối thoải mái
- Hỗ trợ gỡ lỗi từ xa - GUI Java kèm theo
- Hoạt động dễ dàng
Xem ảnh chụp màn hình:
Trang chủ: http://phpdbg.com/
Lỗi PHP - Báo cáo lỗi tốt hơn cho PHP
Điều này rất dễ sử dụng thư viện (thực sự là một tệp) để gỡ lỗi các tập lệnh PHP của bạn.
Điều duy nhất bạn cần làm là bao gồm một tệp như dưới đây (ở đầu mã của bạn):
require('php_error.php');
\php_error\reportErrors();
Sau đó, tất cả các lỗi sẽ cung cấp cho bạn thông tin như backtrace, bối cảnh mã, đối số hàm, biến máy chủ, v.v. Ví dụ:
Các tính năng bao gồm:
- tầm thường để sử dụng, nó chỉ là một tập tin
- lỗi hiển thị trong trình duyệt cho các yêu cầu thông thường và aj Wax
- Yêu cầu AJAX bị tạm dừng, cho phép bạn tự động chạy lại chúng
- mắc lỗi nghiêm trọng nhất có thể (khuyến khích chất lượng mã và có xu hướng cải thiện hiệu suất)
- đoạn mã trên toàn bộ dấu vết ngăn xếp
- cung cấp thêm thông tin (như chữ ký đầy đủ chức năng)
- sửa một số thông báo lỗi hoàn toàn sai
- đánh dấu cú pháp
- trông xinh quá
- tùy biến
- tự bật và tắt
- chạy các phần cụ thể mà không báo cáo lỗi
- bỏ qua các tệp cho phép bạn tránh làm nổi bật mã trong theo dõi ngăn xếp của bạn
- hồ sơ ứng dụng; những điều này được ưu tiên khi xảy ra lỗi!
Trang chủ: http://phperror.net/
GitHub: https://github.com/JosephLenton/PHP-Error
Cái nĩa của tôi (có thêm bản sửa lỗi): https://github.com/kenorb-contrib/PHP-Error
Nếu hệ thống của bạn hỗ trợ theo dõi động DTrace (được cài đặt theo mặc định trên OS X) và PHP của bạn được biên dịch với các đầu dò DTrace được bật ( --enable-dtrace
) theo mặc định, lệnh này có thể giúp bạn gỡ lỗi tập lệnh PHP mà không mất thời gian:
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); }'
Vì vậy, cho bí danh sau đây đã được thêm vào của bạn rc file (ví dụ ~/.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); }"'
bạn có thể theo dõi tập lệnh của mình với bí danh dễ nhớ : trace-php
.
Đây là kịch bản dtrace nâng cao hơn, chỉ cần lưu nó vào dtruss-php.d
, làm cho nó có thể thực thi được ( chmod +x dtruss-php.d
) và chạy:
#!/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));
}
Trang chủ: đèn dtruss tại GitHub
Đây là cách sử dụng đơn giản:
- Chạy :
sudo dtruss-php.d
.
- Trên một thiết bị đầu cuối khác chạy :
php -r "phpinfo();"
.
Để kiểm tra điều đó, bạn có thể truy cập bất kỳ docroot nào index.php
và chạy máy chủ dựng sẵn PHP bằng cách:
php -S localhost:8080
Sau đó, bạn có thể truy cập trang web tại http: // localhost: 8080 / (hoặc chọn bất kỳ cổng nào thuận tiện cho bạn). Từ đó truy cập một số trang để xem đầu ra theo dõi.
Lưu ý: Dtrace có sẵn trên OS X theo mặc định, trên Linux bạn có thể cần dtrace4linux hoặc kiểm tra một số lựa chọn thay thế khác .
Xem: Sử dụng PHP và DTrace tại php.net
Hoặc kiểm tra theo dõi SystemTap bằng cách cài đặt gói phát triển SystemTap SDT (ví dụ yum install systemtap-sdt-devel
).
Dưới đây là tập lệnh ví dụ ( all_probes.stp
) để theo dõi tất cả các điểm thăm dò tĩnh PHP cốt lõi trong suốt thời gian của tập lệnh PHP đang chạy với 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));
}
Sử dụng:
stap -c 'sapi/cli/php test.php' all_probes.stp
Xem: Sử dụng SystemTap với PHP DTrace Tĩnh Probes tại php.net