xdebug、PhpStorm 和 Laravel 3 / mod_rewrite 未命中断点

Posted

技术标签:

【中文标题】xdebug、PhpStorm 和 Laravel 3 / mod_rewrite 未命中断点【英文标题】:Breakpoints not hit with xdebug, PhpStorm and Laravel 3 / mod_rewrite 【发布时间】:2013-04-15 22:55:15 【问题描述】:

我很绝望,没有想法:

我已经为 Laravel 3 项目配置了 xdebug 和 phpStorm。在 Mac OS X Apache 上本地运行项目,因此 PhpStorm 和 Web 应用程序在同一台机器上运行。配置一个虚拟主机,让 localhost.lt 指向 Laravel 的公共目录。

php.ini 中的相关 xdebug 条目:

zend_extension = /usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so
[xdebug]
xdebug.idekey="PHPSTORM"
xdebug.remote_enable=1
xdebug.profiler_enable=1
xdebug.remote_log=/var/log/xdebug_remote.log
xdebug.remote_connect_back=1

确认扩展已加载。

设置没有任何路径映射的 PHP Web 应用程序调试/运行配置,因为没有任何符号链接,并且 Web 服务器和 PhpStorm 上的文件夹完全相同(因为 Web 服务器在同一台机器上)。

从 IDE 通过“调试”启动时,xdebug_remote.log 正确显示了我们在应用程序/库中的文件之一中设置的断点:

<- breakpoint_set -i 5 -t line -f
file:///Users/RalfR/src/livetime/application/libraries/LiveTime.php -n 676
->
<response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="5" id="9230016"></response>

但是,当我们单击调用 LiveTime.php 库中的函数的链接时,不会命中断点。日志显示:

<- stack_get -i 6 -> 
<response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="stack_get" transaction_id="6"><stack where="main" level="0" type="file" filename="file:///Users/RalfR/src/livetime/public/index.php" lineno="14"></stack></response>

<- run -i 7 -> 
<response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="run" transaction_id="7" status="stopping" reason="ok"></response>

<- run -i 8
Log closed at 2013-04-22 21:03:57

与许多框架一样,Laravel 使用 .htaccess mod_rewrite 来通过 public/index.php 传递所有内容。这可能是 PhpStorm / xdebug 没有在 application/libraries/LiveTime.php 中捕获断点的原因,因为 xdebug 似乎从未执行 LiveTime.php 脚本?

如果是这样,我们该如何解决这个问题?

【问题讨论】:

另外,xdebug_break();始终有效,因此与配置错误的 PHP 环境无关。 我也很想知道这个问题的答案! 我有完全相同的问题,只是我使用的是 Symfony,它会中断某些文件,但不会中断其他文件。 xdebug_break();无处不在。 【参考方案1】:

你需要设置Path Mappings你不需要为每个文件设置它。为了解决我的问题,我去了 IntelliJ(与 PHPStorm 相同)Preferences > PHP > Servers .. 选择了我的服务器并设置了以下内容(参见下面的注释 2):注意 1:我也可以将路径直接设置为项目根目录,但由于我对调试 Laravel“公共”文件夹和应用程序以外的任何内容不感兴趣,因此我只为这两个文件夹设置路径。之后一切正常。注意 2: 上面显示的图像不是来自上述步骤中提到的“设置”对话框,而是来自“解决路径映射问题” " 对话框,它为您提供相同的地图映射小部件,其工作方式相同。修复任一位置的设置都将起作用。如果您没有要开始的服务器调试设置并且 IDE 检测到映射问题,则会出现“解决路径映射问题”对话框,此时它还会为您创建服务器设置。

【讨论】:

另外,我注意到的另一件事是,有时,在远程调试时,IDE 中的文件可能与服务器上的文件不同。我的 IDE 设置可以自动将保存的文件复制到远程主机,但这并不总是有效。所以我只是手动启动文件上传,再试一次,它会工作。这解释了为什么某些文件有时会调试而其他文件不会。不调试的文件与远程主机上的不同。 最后一件事.. 一些断线根本不起作用。例如,ifelse 没有用大括号括起来的代码块不能包含在大括号之间的代码,因为断点而中断。 您的解决方案很接近,但对我来说不太适用。相反,我将项目的本地 www 文件夹映射到 PHPStorm 设置 > 服务器中的 /var/www。 @dwenaus 正确,映射也会因项目根目录而异。因此,如果您的项目的根被部署到 Web 服务器的根,那么它们应该匹配。在我上面的例子中,项目根目录与 Web 服务器根目录不同,而是映射到放置在根 Web 目录中的许多应用程序之一,因为我们为 Web 根目录中的每个目录都有一个单独的应用程序(项目),因此整个网站由多个但独立的项目组成。【参考方案2】:

在我的情况下,“breakpoint_set”/“command is not available”问题的原因被禁用了xdebug.extended_info 选项(默认情况下它是启用的,但我禁用它以进行分析)。 断点不起作用,然后 xdebug.extended_info 被禁用。 重新启用xdebug.extended_info 后,我的断点工作了。

【讨论】:

【参考方案3】:

对于使用 Netbeans 和 Laravel 的用户,您需要将“Web Root”设置为您的公共文件夹,该文件夹位于您的项目->Properties->Sources 中。

【讨论】:

以上是关于xdebug、PhpStorm 和 Laravel 3 / mod_rewrite 未命中断点的主要内容,如果未能解决你的问题,请参考以下文章

phpstorm系列之laravel xdebug

PHPStorm+XDEBUG 调试Laravel

phpstorm 调试 laravel

使用宅基地从 PHPStorm 调试 laravel artisan

PHPStorm、Xdebug 和远程调试(在 phpstorm 中使用 FTP)

在 PhpStorm 2016.1 上使用 Laravel / Homestead 启用 PHPUnit 以