PhpStorm XDebug 通过 ssh 隧道

Posted

技术标签:

【中文标题】PhpStorm XDebug 通过 ssh 隧道【英文标题】:PhpStorm XDebug through ssh tunnel 【发布时间】:2018-09-02 02:46:08 【问题描述】:

我有一个通过 ssh 进行远程部署(Ubuntu Server 16.04)的 phpStorm 项目

为了测试我的 PHP 项目,我通过 ssh 隧道(putty)连接到远程服务器:

其中动态端口转发 D1024 用于浏览器代理 并且远程端口转发 R9000 localhost:9000 应该用于 XDebug

我将 PhpStorm 配置为使用 XDebug:

并启用它来监听 PHP 调试连接:

远程服务器上的 XDebug 似乎已启用:

这是我浏览器中 phpinfo() 的 XDebug 部分

xdebug
xdebug support  enabled
Version 2.6.0
IDE Key XDEBUG_ECLIPSE
Supported protocols
DBGp - Common DeBuGger Protocol
Directive   Local Value Master Value
xdebug.auto_trace   Off Off
xdebug.cli_color    0   0
xdebug.collect_assignments  Off Off
xdebug.collect_includes On  On
xdebug.collect_params   0   0
xdebug.collect_return   Off Off
xdebug.collect_vars Off Off
xdebug.coverage_enable  On  On
xdebug.default_enable   On  On
xdebug.dump.COOKIE  no value    no value
xdebug.dump.ENV no value    no value
xdebug.dump.FILES   no value    no value
xdebug.dump.GET no value    no value
xdebug.dump.POST    no value    no value
xdebug.dump.REQUEST no value    no value
xdebug.dump.SERVER  no value    no value
xdebug.dump.SESSION no value    no value
xdebug.dump_globals On  On
xdebug.dump_once    On  On
xdebug.dump_undefined   Off Off
xdebug.extended_info    On  On
xdebug.file_link_format no value    no value
xdebug.filename_format  no value    no value
xdebug.force_display_errors Off Off
xdebug.force_error_reporting    0   0
xdebug.gc_stats_enable  Off Off
xdebug.gc_stats_output_dir  /tmp    /tmp
xdebug.gc_stats_output_name gcstats.%p  gcstats.%p
xdebug.halt_level   0   0
xdebug.idekey   PHPSTORM    PHPSTORM
xdebug.max_nesting_level    256 256
xdebug.max_stack_frames -1  -1
xdebug.overload_var_dump    2   2
xdebug.profiler_aggregate   Off Off
xdebug.profiler_append  Off Off
xdebug.profiler_enable  Off Off
xdebug.profiler_enable_trigger  Off Off
xdebug.profiler_enable_trigger_value    no value    no value
xdebug.profiler_output_dir  /tmp    /tmp
xdebug.profiler_output_name cachegrind.out.%p   cachegrind.out.%p
xdebug.remote_addr_header   no value    no value
xdebug.remote_autostart On  On
xdebug.remote_connect_back  Off Off
xdebug.remote_cookie_expire_time    3600    3600
xdebug.remote_enable    On  On
xdebug.remote_handler   dbgp    dbgp
xdebug.remote_host  127.0.0.1   127.0.0.1
xdebug.remote_log   /var/log/apache2/xdebug.log /var/log/apache2/xdebug.log
xdebug.remote_mode  req req
xdebug.remote_port  9000    9000
xdebug.remote_timeout   200 200
xdebug.scream   Off Off
xdebug.show_error_trace Off Off
xdebug.show_exception_trace Off Off
xdebug.show_local_vars  Off Off
xdebug.show_mem_delta   Off Off
xdebug.trace_enable_trigger Off Off
xdebug.trace_enable_trigger_value   no value    no value
xdebug.trace_format 0   0
xdebug.trace_options    0   0
xdebug.trace_output_dir /tmp    /tmp
xdebug.trace_output_name    trace.%c    trace.%c
xdebug.var_display_max_children 128 128
xdebug.var_display_max_data 512 512
xdebug.var_display_max_depth    3   3

这个是命令行中 php -i 的 xdebug grep:

 php -i | grep xdebug
/etc/php/7.1/cli/conf.d/20-xdebug.ini
xdebug
xdebug support => enabled
xdebug.auto_trace => Off => Off
xdebug.cli_color => 0 => 0
xdebug.collect_assignments => Off => Off
xdebug.collect_includes => On => On
xdebug.collect_params => 0 => 0
xdebug.collect_return => Off => Off
xdebug.collect_vars => Off => Off
xdebug.coverage_enable => On => On
xdebug.default_enable => On => On
xdebug.dump.COOKIE => no value => no value
xdebug.dump.ENV => no value => no value
xdebug.dump.FILES => no value => no value
xdebug.dump.GET => no value => no value
xdebug.dump.POST => no value => no value
xdebug.dump.REQUEST => no value => no value
xdebug.dump.SERVER => no value => no value
xdebug.dump.SESSION => no value => no value
xdebug.dump_globals => On => On
xdebug.dump_once => On => On
xdebug.dump_undefined => Off => Off
xdebug.extended_info => On => On
xdebug.file_link_format => no value => no value
xdebug.filename_format => no value => no value
xdebug.force_display_errors => Off => Off
xdebug.force_error_reporting => 0 => 0
xdebug.gc_stats_enable => Off => Off
xdebug.gc_stats_output_dir => /tmp => /tmp
xdebug.gc_stats_output_name => gcstats.%p => gcstats.%p
xdebug.halt_level => 0 => 0
xdebug.idekey => PHPSTORM => PHPSTORM
xdebug.max_nesting_level => 256 => 256
xdebug.max_stack_frames => -1 => -1
xdebug.overload_var_dump => 2 => 2
xdebug.profiler_aggregate => Off => Off
xdebug.profiler_append => Off => Off
xdebug.profiler_enable => Off => Off
xdebug.profiler_enable_trigger => Off => Off
xdebug.profiler_enable_trigger_value => no value => no value
xdebug.profiler_output_dir => /tmp => /tmp
xdebug.profiler_output_name => cachegrind.out.%p => cachegrind.out.%p
xdebug.remote_addr_header => no value => no value
xdebug.remote_autostart => On => On
xdebug.remote_connect_back => Off => Off
xdebug.remote_cookie_expire_time => 3600 => 3600
xdebug.remote_enable => On => On
xdebug.remote_handler => dbgp => dbgp
xdebug.remote_host => 127.0.0.1 => 127.0.0.1
xdebug.remote_log => /var/log/apache2/xdebug.log => /var/log/apache2/xdebug.log
xdebug.remote_mode => req => req
xdebug.remote_port => 9000 => 9000
xdebug.remote_timeout => 200 => 200
xdebug.scream => Off => Off
xdebug.show_error_trace => Off => Off
xdebug.show_exception_trace => Off => Off
xdebug.show_local_vars => Off => Off
xdebug.show_mem_delta => Off => Off
xdebug.trace_enable_trigger => Off => Off
xdebug.trace_enable_trigger_value => no value => no value
xdebug.trace_format => 0 => 0
xdebug.trace_options => 0 => 0
xdebug.trace_output_dir => /tmp => /tmp
xdebug.trace_output_name => trace.%c => trace.%c
xdebug.var_display_max_children => 128 => 128
xdebug.var_display_max_data => 512 => 512
xdebug.var_display_max_depth => 3 => 3

并且我的浏览器正在发送正确的 cookie,因为从 Xdebug Helper Firefox 扩展中启用了调试:

这是我在 /etc/php/7.1/mods-available/xdebug.ini 中的 XDebug 配置

zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=1
xdebug.idekey="PHPSTORM"

这是xdebug.log的内容

Log opened at 2018-03-23 11:39:26
I: Connecting to configured address/port: locahost:9000.
W: Creating socket for 'locahost:9000', getaddrinfo: No such file or directory.
E: Could not connect to client. :-(
Log closed at 2018-03-23 11:39:26

当我执行我的项目时,通过我的浏览器导航它(ssh 隧道)在 PhpStorm 中没有任何反应(即使我在脚本的一开始就设置了断点)

我哪里错了?

也许我在Putty中设置的两个端口转发相互干扰?我该如何解决?

【问题讨论】:

1) 收集 xdebug 日志——它会告诉 xdebug 端发生了什么 2) RTFM——xdebug.remote_connect_back=On 的值 xdebug.remote_host 被忽略并使用自动检测的 IP (REMOTE_ADDR most可能).. 这在您的设置中根本没有用。 文档? xdebug.remote_log 为什么说locahost? 1)你有一个错字 - 它应该是localhost(这就是错误所说的 - 它无法解析locahost域)2)你发布的xdebug设置清楚地使用127.0.0.1地址......有你编辑后? 3) 更好地验证你从phpinfo() 输出中得到了什么——xdebug 部分——你最初发布的那个是非常无用的,因为它只显示了最没用的设置的顶部。 1) 那么新的 xdebug 日志有什么要说的呢? 2) 这些设置——它们是从通过浏览器或控制台捕获的phpinfo() 输出中获取的吗?它必须与您尝试调试的方式相同。 什么是“没有新意”?是否显示完全相同的日志?如果是这样 - 您的设置有问题...您的 xdebug 设置现在显示 9001 端口。日志中显示什么端口?您是否设置了 SSH 隧道以使用该 9001 端口?很抱歉..但是混合新旧信息在这里没有帮助(因为它们显示不同的设置)。 【参考方案1】:

putty 隧道配置有错别字,写的是 locahost 而不是 localhost

【讨论】:

以上是关于PhpStorm XDebug 通过 ssh 隧道的主要内容,如果未能解决你的问题,请参考以下文章

在 Docker for Mac 上使用 SSH 隧道进行 Xdebug

[视频教程]利用SSH隧道进行远程腾讯云服务器项目xdebug调试

本地xdebug调试搭建 Laravel+homestead+phpstorm

是否可以转发 Xdebug 连接?

PhpStorm+Xdebug配置单步调试PHP

给Mac安装配置PHPStorm和Xdebug