php + docker + idea debug

需求:

  • 在进行php 编写的时候,为了使环境和prod 更像,使用 docker 镜像模拟线上版本
  • 但是编写代码使用的是 idea 在win10环境下
  • 有时候使用log 定位问题会有一些弊端,还是需要配合xdebug 来实现

进程:

  • 安装 xdebug.so
  • 因为我用的是php 7.0 版本,没有可以直接apt 安装的地方所以使用手动编译
  • 下载xdebug 源码 并编译
bash 复制代码
#下载对应的编译包
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 里加入代码
bash 复制代码
[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
相关推荐
zjjuejin6 小时前
Docker 镜像管理完全指南:从拉取到迁移的终极实践
后端·docker
会写代码的饭桶6 小时前
【服务器部署】CentOS 7/8 离线部署 Harbor v2.10.3 超详细攻略
docker·centos·harbor·离线安装·私有镜像仓库
蚊子爱喝水7 小时前
高性能多线程 PHP 图像处理库 PHP-VIPS:颠覆你对图像处理的认知
开发语言·图像处理·php
Johny_Zhao9 小时前
达梦数据库高可用集群部署方案
linux·mysql·网络安全·docker·信息安全·kubernetes·云计算·shell·containerd·达梦数据库·yum源·系统运维·centos8
jingfeng5149 小时前
网络编程 socket——TCP
网络·tcp/ip·php
Lethehong9 小时前
从零开始在Ubuntu上快速部署Docker和Dify:结合 Dify + 蓝耘 MaaS平台打造 AI 应用实战指南
linux·人工智能·ubuntu·docker·蓝耘智算·蓝耘maas平台
wheeldown10 小时前
从电脑底层到进程创建:一篇看懂冯诺依曼、OS和进程
linux·服务器·php
搞不懂语言的程序员11 小时前
docker 部署Skywalking
docker·容器·skywalking
敲上瘾12 小时前
Docker镜像指南:从核心命令到离线迁移实战
linux·运维·docker·容器·架构