前言
最近审计php代码发现手动打印变量实在是太累了,不能快速的了解目标应用程序的运行逻辑。还是决定转战xdebug,下面是一些简单的记录…真香
docker环境获取
为什么用docker来搭建调试环境呢?一是本地搭建比较麻烦,二是没有docker便携,放在docker里,更加灵活。docker环境可以直接到dockerhub上去找一个,我用的下面这个
https://hub.docker.com/r/tommylau/xdebug
上面这个环境,集成了php+apache+xdebug,配置也是没啥大问题的,网上很多教程都说安装好xdebug还需要在php.ini里进行配置,但是这个环境的配置文件在/usr/local/etc/php/conf.d/ext-xdebug.ini
,内容如下
zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_autostart=0
xdebug.remote_connect_back=1
xdebug.remote_port=9000
这个配置文件我们后面还需要稍微改一下
phpstorm远程调试环境配置
在调试之前,我们需要先把web应用部署到docker中去
docker run --name xdebug -v /path/to/web:/var/www/html -p 80:80 -d tommylau/xdebug
运行上述命令,可以把本地的web目录挂载到docker的web目录中。如果需要连接宿主机的数据库,那么只需要在数据库连接配置时指定数据库ip为宿主机的ip就行(当然,首先要保证你使用的用户支持远程连接)
如果要使root用户支持远程主机连接,可以执行以下命令:
grant all privileges on . to ‘root’@’%’ identified by ‘密码’ with grant option;
flush privileges;
如果要连接其他docker中的数据库,网上有教程,就不详述了。
接下来我们开始配置phpstorm吧
- 在settings>build,Execution,Deployment>Deployment 点击+号新建一个deployment,由于我们这里使用的是docker挂载目录的方式,所以type选择选择
in place
也没啥问题,web server url选择项目的在服务器上的路径(url)
- 然后选择Mappings选项,设置映射
- 在settings>Languages&Frameworks > php中设置php解释器
- 展开php这一栏,选中debug栏,设置一下监听端口,这处的端口可不是随便填的,需要和docker里xdebug配置的那个端口一致
- 展开debug栏,选中DBGp Proxy,IDE key比较关键,这就涉及到我们服务端xdebug的设置了,xdebug的设置修改为下面这样
zend_extension=xdebug.so
xdebug.idekey="PHPSTORM"
xdebug.remote_enable=1
xdebug.remote_autostart=0
xdebug.remote_connect_back=1
xdebug.remote_port=9000
也就是添加了一行xdebug.idekey="PHPSTORM"
,所以phpstorm中配置的ide key需要和服务器上的xdebug配置文件中的idekey一致,至于host和port就是服务器的host:port
- 然后再选中servers栏,点击+号创建一个server, host port就是web服务器地址,debugger选择Xdebug,然后这里需要勾选path mappings,并且正确设置目录映射,否则调试的时候,会出现cannot find a local file的错误,类似下面这样
-
最后,需要编辑一下deubg 的配置
创建一个php web page,然后server选择我们刚刚创建的xdebug, 设置一下需要调试项目的url
-
设置的差不多了,我们在run > web server debug validation栏检查设置是否正确,记得选中remote web server, deployment server就是我们刚刚创建的deployment, 出现如下现象则表示设置正确
现在就可以debug刚刚创建的 php web page了,点击右上角那个小虫子就行,这是可能出现如下问题
cannot find a local copy of the file .....
,这时候点击click to set up path mappings
会弹出一个框,然后选中那个复选框就行
接下来就可以愉快的调试了
参考
https://segmentfault.com/a/1190000011907425