直接用 docker-compose。phpstorm 的 docker 集成仅识别 docker-compose.yml 定义的服务,docker run 启动的容器无法被自动发现,导致调试失败、路径映射错位;需在 docker-compose.yml 中正确定义 php 服务、端口、卷映射,并通过 phpstorm 的 remote interpreter + docker compose 方式配置解释器,路径填 /usr/bin/php;xdebug 必须设 xdebug_mode=debug、xdebug_client_host=host.docker.internal(win/linux)或 docker.for.mac.host.internal(macos)、端口 9003,且 phpstorm 中 debug port 和 servers 路径映射需同步配置;开发时应禁用 opcache、重生成 autoload、清除框架缓存,并确保开启“start listening for php debug connections”。
php 运行时选 docker-compose 还是 docker run?
直接用 docker-compose。phpstorm 的 docker 集成默认只识别 docker-compose.yml 中定义的服务,docker run 启的容器不会被自动发现,调试器连不上、路径映射也容易错位。
常见错误现象:Cannot resolve path mapping 或断点不生效,八成是因为没走 docker-compose 启动流程。
-
docker-compose.yml里必须声明services下的 PHP 服务(比如叫php或app),且含image或build字段 - 端口暴露要显式写
ports,哪怕只是内部通信(如 Xdebug 需要9003) - 卷映射(
volumes)的本地路径必须和 PhpStorm 项目根路径一致,否则文件同步失败
怎么让 PhpStorm 找到容器里的 PHP 解释器?
不是手动填容器 IP 和端口,而是通过「Remote Interpreter」+「Docker Compose」方式配置,PhpStorm 会自动拉取镜像、启动服务、挂载路径、注入环境变量。
使用场景:需要在容器内执行 composer install、运行 PHPUnit、或用 php -v 检查扩展是否加载成功。
- 设置路径:File → Settings → PHP → Interpreter → 加号 → Remote Interpreter → Docker Compose
- 选对
docker-compose.yml文件,再选中对应服务名(如php)——注意不是容器名,是services:下的键名 - 解释器路径填
/usr/bin/php(Alpine 是/usr/bin/php,Debian 系也是,别写成/bin/sh -c "php") - 如果提示
Connection refused,先在终端跑docker-compose up -d php确保服务已启动
Xdebug 断点不触发?检查这三处配置
容器里开了 Xdebug,但 PhpStorm 不停,大概率是客户端(IDE)和服务端(容器)的通信没对上,尤其在 macOS / Windows 上 Docker Desktop 的网络桥接有坑。
参数差异:XDEBUG_MODE=debug 是 3.0+ 必须项,老版本用 XDEBUG_CONFIG;client_host 在 Docker 场景下不能写 localhost。
- 容器内 Xdebug 配置(如
php.ini或conf.d/xdebug.ini)至少要有:zend_extension=xdebug.so<br>XDEBUG_MODE=debug<br>XDEBUG_CLIENT_HOST=docker.for.mac.host.internal # macOS<br>XDEBUG_CLIENT_HOST=host.docker.internal # Windows / Linux Docker Desktop<br>XDEBUG_CLIENT_PORT=9003
- PhpStorm 的 Debug 配置里,
Settings → PHP → Debug → Xdebug → Debug port必须设为9003(不是默认的9000) - 别漏掉
Settings → PHP → Servers:Host 填localhost,Port 填你服务暴露的端口(如8080),然后勾上Use path mappings,把项目根目录映射到容器内绝对路径(如/var/www/html)
改了代码容器里没更新?别信 volume 自动同步
Docker 卷映射本身没问题,但 PHP 的 OPCache、Composer autoload、甚至某些框架的缓存机制会锁住旧文件,导致你改了代码,容器里还是跑的老版本。
性能影响:OPCache 开着时,即使文件变了,PHP 仍可能从内存里读字节码,调试时看到的永远是“上一次”。
- 开发阶段务必关掉 OPCache:
opcache.enable=0,或直接删掉opcache.so加载行 - Composer autoload 要重新生成:
docker-compose exec php composer dump-autoload - 某些框架(Laravel、Symfony)有独立缓存,得进容器手动清:
docker-compose exec php php artisan config:clear - 如果用的是
bind mount(即./src:/var/www/html),确认宿主机文件权限没卡住(尤其 Windows + WSL2 下容易出现只读)
最常被忽略的其实是 Xdebug 的 discover_client_host —— 它在 Docker 里基本不可靠,硬编码 host.docker.internal 才稳。还有就是 PhpStorm 的 “Start Listening for PHP Debug Connections” 按钮,忘了点它,断点就永远灰着。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










