你怎么调试PHP scripts?[关闭]
题
你怎么试 PHP 剧本?
我知道基本的调试,例如使用错误汇报。断点进行调试 PHPEclipse 也是很有用的。
什么是的 最好的 (在条款的快速和便捷的)的方式进行"调试"在phpStorm或任何其他IDE?
解决方案
尝试 日食。 设置一个日食的环境,具有调试设有像你这样提到的。能够步入代码是一个更好的方法来调试那么旧的方法var_dump和打印的各点,看看那里你的流动出现错误。当一切都失败时,虽然所有我有的是SSH和vim我仍然 var_dump()
/die()
找到这里的代码去南方。
其他提示
你可以使用Firephp加到萤火虫调试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;
}
}
}
Xdebug和用插件记事本++对于沉重的责任的错误狩猎、FirePHP轻的东西。快速和肮脏?没有什么比 dBug.
XDebug 至关重要的发展。我安装它之前的其他任何扩展。它给你堆的痕迹上的任何错误,并可以使分析很容易。
快看一个数据结构的使用 var_dump()
.不要用 print_r()
因为你必须要环绕着它 <pre>
和它只是打印一个var的时间。
<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>
一个真正的调试环境,最好的我发现是 科莫多巨蜥IDE 但是它的成本$$.
PhpEd是真的很好。你可以进入/过出的功能。你可以运行的特别代码、检查的变量,改变。这是惊人的。
1)我用print_r().在件,我有一个片段'pre'它扩展到这样的:
echo "<pre>";
print_r();
echo "</pre>";
2)我用Xdebug,但还没有能够获得GUI工作的权利在我Mac。它至少打印出一个可读的版本的堆踪。
我用的 Zend室(5.5), 一起 Zend平台.这给了适当的调试,断点/跨过代码等, 虽然有代价的。
在所有诚实、组合的打印和print_r()打印出来的变量。我知道,许多人宁愿使用其他更先进的方法,但我找到这个最简单的使用。
我会说,我没有完全理解这个直到我做了一些微处理器编程,在大学和不能使用,即使这一点。
我用//需要将物品寄与XDebug.检查它在其网站文件如何配置。http://php.netbeans.org/
我用//需要将物品寄与XDebug和 容易XDebug FireFox上
加上必须在调试软的项目,因为正常的方式XDebug运//需要将物品寄登记的dbug届会议通过的网址。与增加对安装在火狐,你将你的//需要将物品寄项目的性质->运行Configuratuion->高级和选择"不要打开万维网浏览器"你现在可以在设置你的突破点,并开始调试届会议与Ctrl-F5像往常一样。开火狐和权击加上标在右下角开始监测断点。当代码到达断点,它就会停止,你可以检查你的变量的国家和呼堆。
产出的缓冲,是非常有用的,如果你不想搞砸你的输出。我这样做在一个衬垫,我可以评论/取消在会
ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();
PhpEdit有一个调试器,但是我通常的最终使用echo();和print_r();老式的方式!
对于真正坚韧不拔的问题,将过于耗费时间的使用print_r/回波图找出我用我的IDE(PhpEd)调试的功能。不像其它的IDEs我已经使用,PhpEd要求几乎没有设置。的唯一原因,我不会用于任何问题,我遇到的是,它的 痛苦 慢。我不确定缓慢的特定PhpEd或任何php debugger.PhpEd不是免费的,但我认为它使用一个开放源调试器(如XDebug前所述)。利益有PhpEd,再次是,它不需要设置我们发现真相当繁琐的过去。
手册试通常更快的-我的 var_dump()
和 debug_print_backtrace()
是所有你需要的工具,手臂你的逻辑。
好吧,到一定程度上取决于这里的东西是要去南方。那是第一件事我试着分离,然后我会用回声/print_r()作为必要的。
NB:你们知道,你可以通过真正作为第二个参数print_r()就返回本输出相反的印刷吗?E.g.:
echo "<pre>".print_r($var, true)."</pre>";
我经常使用Cake当轨道是不可能的。调试的错误我通常会发现的 error.log
在tmp文件夹和尾它在终端用命令...
tail -f app/tmp/logs/error.log
它给你的运行对话,从蛋糕的是怎么回事,这是相当不方便,如果要输出它的东西中的代码可以使用。
$this->log('xxxx');
这通常可以给你一个很好的怎么回事/错误的。
print_r(debug_backtrace());
或者类似的东西:-)
科莫多巨蜥IDE工作以及与xdebug,即使对于remore调试。它需要的最低数额的配置。所有你需要的是一个版本的php科莫多巨蜥可以使用本地步通过代码在一个断点。如果你有脚本进口到科莫多项目,然后你就可以集断点一下鼠标点击的只是你如何将它设置内部的日食进行调试java程序。Remote debugging显然是更加棘手,获得其正常工作(你可能需要地图的远程url php script在你的工作空间)比当地调试的设置,这是很容易配置的,如果你在一个或一个linux桌面上。
Nusphere也是一个很好的php debugger nusphere
有许多PHP debugging技术,可以节省你的无数小时的编码。一个有效的,但基本调试技巧是简单地把上的错误报告。另一个稍微更先进的技术包括使用打印的发言,它可以帮助查明更多的难以捉摸的错误的通过显示其实什么到屏幕上。PHPeclipse是一个日食的插件,可以突出常见的语法错误和可以结合使用,有一个调试器组断点。
display_errors = Off
error_reporting = E_ALL
display_errors = On
并且还用
error_log();
console_log();
在生产环境中,我的日志相关的数据服务器的错误记录与error_log().
我用zend工作室蚀与建立在调试器。它仍然缓慢相比,调试用日食pdt与xdebug.希望他们将修复这些问题的速度已经改善,在最近的版本,但仍然走过的事情需要2-3秒钟。Zend firefox工具栏真正使事情变得简单("调试"下一页,前页,等等)。此外,它提供了一个分析器,这将基准代码并提供饼图表,执行时间,等等。
最大的错误可以很容易地发现,通过简单的 var_dump
荷兰国际集团的一些关键的变量,但它显然取决于什么样的应用程序开发。
对于一个更复杂的算法的步骤/断点观察的功能是非常有用的(如果不是必须的)
PHP文件
交互式Stepthrough PHP Debugger实现为SAPI模块,可以给予你完全的控制环境,同时不影响功能或履行你的代码。它的目标是轻质、功能强大,易于使用的调试平台PHP5.4+和它运出的PHP5.6.
特征包括:
- Stepthrough调试
- 灵活断点(类方法、职能、文件:行,地址、操作码)
- 容易获PHP内建eval()
- 方便地访问目前执行代码
- Userland API
- SAPI无关-很容易地集
- PHP Configuration File Support
- JIT超Globals设自己的!
- 可选readline支持舒适的终端上操作
- Remote Debugging支持捆绑Java GUI
- 很容易操作
看到截图:
PHP错误 -更好的错误报告的PHP
这是非常易于使用的图书馆(实际上是一个文件),调试PHP scripts.
唯一的事情,你要做的就是要包括一个文件作为下文(在开始你的代码):
require('php_error.php');
\php_error\reportErrors();
然后所有的错误,会给你信息,如回溯,代码方面,功能的参数,服务器的变量,等等。例如:
特征包括:
- 微不足道的使用,它只是一个文件
- 错误显示在浏览器用于正常和ajaxy请求
- 阿贾克斯的请求暂停,允许您可以自动重新运行
- 使错误,因为严格,尽可能(鼓励码的质量,并趋向于提高性能)
- 代码段在整个堆栈
- 提供更多的信息(如功能齐全签名)
- 修复了一些错误信息,它们只是简单的错误
- 语法突出显示
- 看起来漂亮!
- 定制的
- 手动把它打开和关闭
- 运行的特定部分没有错误的报告
- 忽略文件,允许你为了避免强调码在你叠跟踪
- 应用程序文件;这些优先次序时,一个错误罢工!
审查: https://github.com/JosephLenton/PHP-Error
我的叉子(有额外修复): https://github.com/kenorb-contrib/PHP-Error
。
如果系统支持 动态跟踪。 (默认安装在OS X)和PHP编制的。探测器启用(--enable-dtrace
)这应该是默认情况下,该命令可以帮助你在调试PHP script没有时间:
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
.
这是更高级的。剧本,只保存进入 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灯 在审查
这里是简单的使用情况:
- 运行:
sudo dtruss-php.d
. - 在另一个终端运行:
php -r "phpinfo();"
.
来测试这些,你可以去任何与根文档 index.php
和运行PHP builtin服务器:
php -S localhost:8080
在那之后,你可以访问该网站在 http://localhost:8080/ (或选择任何口是方便的)。从那里访问的一些网页,查看跟踪产出。
注:。提供OS X默认情况下,在Linux上,你可能需要 dtrace4linux 或检查一些其他的 替代品.
参见: 使用PHP和。 在php.net
所
或者检查所跟踪通过安装所特殊和差别待遇的发展一揽子计划(例如 yum install systemtap-sdt-devel
).
这里是例脚本(all_probes.stp
),用于追踪所有核心PHP静态探测点期间的运行PHP script与所:
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
参见: 使用所有PHP。静态探测器 在php.net
+1print_r().用它来自卸出的内容的对象或可变的。来使它更具可读性,这样做与一个预的标签,所以你不需要来源。
echo '<pre>';
print_r($arrayOrObject);
还var_dump($事)-这是非常有用的见类型的subthings
根据这个问题我喜欢的组合error_reporting(E_ALL)混合回声测试(以找到违规行/文件中的错误发生在最初;你知道它并不总是符/文件php告诉你的权利?), IDE括号匹配(以解决"分析错误:语法错误,意外$端"问题),并print_r();退出;垃圾场(实际程序看源;p)。
你还不能打败phpdebug(检查sourceforge)与"memory_get_usage();"和"memory_get_peak_usage();"查找问题领域。
综合调试器,你可以看值的变量的变化的步通过代码真的很酷的。他们这样做,但是,需要软件的安装服务器上的一定数额的配置。这两者都需要定期维护保持良好工作秩序。
一print_r容易写,并保证工作中任意设置。
通常我找到创建一个自定义的日志的功能能节省文件,进行存储"调试"的信息,并最终重新打印在一个共同的脚注。
你也可以复盖共同的异常类,因此,这种类型的调试是半自动的。