内网Visual Studio Code通过XDebug远程调试linux服务器PHP脚本

开发环境是这样:一台位于内网环境下的Windows机器使用VSCode作为IDE编写PHP脚本项目,一台位于公网的linux服务器运行lighttpd、fastcgi PHP用于部署调试。开发机所在网络环境不允许或不方便进行端口映射来打开XDebug所需的本地调试监听端口(默认9000),同时也不想安装本机PHP服务器来调试,于是采用本机编写PHP,然后上传linux服务器直接远程调试,记录环境搭建过程如下:
首先配置好开发机的IDE环境,我用的是VSCode 1.6.1,然后安装PHP Debug扩展,完成后选择一个指定文件夹作为项目根目录并在调试页中新建PHP调试配置,这时会在项目文件夹中生成.vscode/launch.json配置文件,按照PHP Debug的说明,加入serverSourceRoot与localSourceRoot,参考如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "serverSourceRoot": "/var/www/lighttpd/phpproj",
            "localSourceRoot": "${workspaceRoot}"
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000,
            "serverSourceRoot": "/var/www/lighttpd/phpproj",
            "localSourceRoot": "${workspaceRoot}"
        }
    ]
}

其中serverSourceRoot为项目位于服务器端的存储位置完整路径,localSourceRoot为本地项目存储位置完整路径,一般用环境变量${workspaceRoot}即可表示项目根目录。

调试用linux服务器端在PHP服务器可用的前提下,安装XDebug PHP调试扩展,在CentOS上可直接运行

yum install php-pecl-xdebug

安装,其它环境、安装方式可参考XDebug官方说明。
安装好后修改XDebug配置文件/etc/php.d/xdebug.ini,内容如下:

; Enable xdebug extension module
zend_extension=/usr/lib/php/modules/xdebug.so

[XDebug]
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 0

开启XDebug的调试功能,然后重启web服务器以使安装好的XDebug扩展及相关配置生效。重启后可通过phpinfo()内容验证XDebug是否成功启用并且设置的参数是否正确。没问题后开发环境已经算是搭建好了,接下来要解决的就是开发机的内网问题,一般来说,如果开发机和服务器都位于公网或可随意映射端口时,通过XDebug调试的过程是这样:开发机访问服务器的web服务器上的PHP脚本,这时服务器端PHP的XDebug扩展会回连发起HTTP请求设备的调试端口(默认9000),成功后即可开始断点调试等操作。另外这种情况下还可通过xdebug.remote_host的方式指定开发机的IP来选择允许指定IP进行调试操作。但在开发机处于内网环境并无法暴露调试端口的情况下,显然XDebug的回连操作是无法成功的,这时就需要通过某种方式来使调试连接能够成功建立,这里我使用的是ssh tunnel的方式,下面操作是以token2shell作为ssh客户端,通过其自带SSHpf程序来完成隧道建立的,其它ssh客户端如putty等也可实现类似功能:
打开token2shell的SSHpf,编辑连接,输入正确的server信息,并添SSH Port Forwarding,Type使用Remote Forwarding,Remote Port填写9000,Destination Host的Address为127.0.0.1,Port 9000。设置好后点击连接,验证成功后隧道连接即建立完成,可以在服务器端console通过netstat -lap查看到sshd正在侦听9000端口。然后开启VSCode的调试Listen for XDebug,然后设置PHP脚本的断点,打开任意浏览器,访问服务器端的对应php文件(当然,事先需要将本地的php上传到服务器端),一切正确的话断点就可以命中了。

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。