php + docker + idea debug
需求:
- 在进行php 编写的时候,为了使环境和prod 更像,使用 docker 镜像模拟线上版本
- 但是编写代码使用的是 idea 在win10环境下
- 有时候使用log 定位问题会有一些弊端,还是需要配合xdebug 来实现
进程:
- 安装 xdebug.so
- 因为我用的是php 7.0 版本,没有可以直接apt 安装的地方所以使用手动编译
- 下载xdebug 源码 并编译
#下载对应的编译包
sudo apt-get update && sudo apt-get install php-dev autoconf automake libtool make gcc
wget https://codeload.github.com/xdebug/xdebug/tar.gz/refs/tags/2.7.2 -O xdebug-2.7.2.tar.gz
tar -xvzf xdebug-2.7.2.tar.gz
cd xdebug-2.7.2
#phpize 会为 PHP 扩展准备编译环境。
phpize
#输出类似如下
#Configuring for:
#PHP Api Version: 20151012
#Zend Module Api No: 20151012
#Zend Extension Api No: 320151012
#编译
./configure --enable-xdebug
make
- 编译完成之后会有一个xdebug.so文件,拷贝到php 能load 到的地方
- 然后就是修改php.ini 文件,但是会有两个地方,一个是 /etc/php/7.0/cli/php.ini,还有一个是 /etc/php/7.0/fpm/php.ini
- 这两个的区别是,一个是直接用php 去运行的时候会用到,一个是 php-fpm 的时候会用到,cli 就是直接在控制台输入 php run.php 这种时候调用的,fpm 一般是nginx 转发的时候用到的
- 直接在php.ini 里加入代码
[Xdebug]
zend_extension=/usr/lib/php/20151012/xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=host.docker.internal
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_name=/mnt/analysisInfo/cachegrind.out.%p
xdebug.remote_port=9099
- host.docker.internal 指向的是宿主机的地址,正常docker desktop 都认这个,如果是跨ip 的调试,可以直接用对应的ip, profiler_enable_trigger 表示支持查看代码的运行效率啊什么的,可以不填,填了这个的话需要在请求的时候带上头信息XDEBUG_PROFILE=1
- remote_port 是idea 需要开的监听端口,
请注意: 是idea 要开的监听,不是容器,所以不需要把9099 这个端口映射出来
- idea 在 setting > language > php > Debug 上 有一个 debug port 这个填上 9099
- 然后再servers 里创建一个 服务的端口监听,比如你的是docker 里的8001 端口,映射到本地的8002 端口,那 servers 里就填8002,因为你最终访问的是 localhost:8002 ,里面的use path map 配置在服务端的,代码服务的根目录地址就行,比如本地代码是 D:/pro/test 部署在容器里的 /mnt/test, 那就只要映射 D:/pro/test /mnt/test 这一层就可以了,
这个目录下的文件xdegbu 会自动拓展映射
- 然后就可以配置一个
php web page
的debug 服务了,内容随便填,只要选的那个server 是上面配置好的就行,然后就直接debug,debug 的时候会有一个参数在网页上XDEBUG_SESSION_START=1234, 千万记得,这个参数,要配置到发请求的地方,要放在url 上这个一个cache 的参数 - 以上就可以debug 了
拓展:
- 有人喜欢用idekey 来做映射,这个会用到一个参数
xdebug.remote_autostart=1
- 这个参数请注意,他和上面的那个不一样,你可以认为上面的会动态的配置一个 idekey,但这个不会,他会给你写死一个,而且这个ideakey 还要配置在 setting > language > php > Debug > DBGp Proxy 下,但是他不一定能正常链接,而且在你使用了这个参数到时候,上面配置的那个就会失效,所以如果debug 失败的话,看一下是不是多了这么个参数,可以删掉再试试
- 在查看xdebug 是否正常的时候可以开启日志
xdebug.remote_log=/tmp/xdebug.log
- 如果连接到了服务并且服务是正常的会有一个
Connected to client
,但是没有被idea 捕获,那就看看上面的这个问题是否存在,还有就是port 是不是正常的,如果是window 可以看看 端口占用情况netstat -ano | findstr :9099