PhpStorm 配置 Xdebug 3,及常见问题
做PHP开发也很多年了,Xdebug也配过很多次,但总觉得不是刚需,感觉有没有都行;另一方面它配置复杂(新方法很简单),每个项目都得配一遍(新方法也避免不了),并且在公司配完,回到家还得修改hosts 中的ip(新方法不需要)。种种原因,使用Xdebug的习惯并没有延续下来。直到我近日接触了yii2中的事件,比如:
$config = [
'components' => [
...
],
'on beforeRequest' => function($event) {
\yii\base\Event::on(\yii\db\BaseActiveRecord::class,
\yii\db\BaseActiveRecord::EVENT_AFTER_FIND, ['common\models\Operate', 'RecordOperateInfo']);
},
]
假如要调试common\models\Operate
中的RecordOperateInfo
,如果没有Xdebug,你可能会先写一个临时控制器,再调一下这个model方法,当然也行。但有了Xdebug就方便很多了,你可以直接在model方法中下断点。
下面看下如何配置
配置
这里我的PHP环境是基于docker的,非docker的也大同小异
修改php.ini
[xdebug]
zend_extension = xdebug.so
xdebug.mode=debug
xdebug.client_host=host.docker.internal
;xdebug.discover_client_host=yes
xdebug.client_port=9003
xdebug.start_with_request=yes
注意,你的php环境用的docker-compose.yml
可能需要修改一下,允许容器内通过localhost访问宿主机(是可能,未验证!)
docker-php-fpm:
image: php:1.1-work
hostname: php-fpm
extra_hosts: #允许容器内通过localhost访问宿主机
- host.docker.internal:host-gateway
networks:
- web-network
使用
PhpStorm 要配置的很少,直接开始
第一步
第二步
访问接口,触发事件。这时你会看到如下弹窗
第三步
打开 PhpStorm 的设置,如下
第四步
再次访问接口,就成功了
CLI模式
平时开发中cli模式也是用的比较多的。当你配置完上面那些,准备进入容器,调试控制台脚本时
cuiwei@weideMacBook-Pro yii-demo % docker exec -it e31afbaf8164d7b2abf2a38f5fe22477fe681ef6b663797150cb56bdbaf1441f /bin/sh
# bash
root@php-fpm:/var/www/html# cd ../yii-demo
root@php-fpm:/var/www/yii-demo# php test.php
会看到如下错误:
这时你只需设置一下PHP_IDE_CONFIG
环境变量即可,其他都是多余
root@php-fpm:/var/www/yii-demo# export PHP_IDE_CONFIG="serverName=yii.cw.net"
常见问题
如果不成功,第一个需要确认的是9003端口是否可用
注意,先开启监听,如下
然后在本机和php容器内分别执行
cuiwei@weideMacBook-Pro ~ % telnet 127.0.0.1 9003
root@php-fpm:/var/www/html# telnet host.docker.internal 9003
问题1
通常我们配置nginx的时候,想通过ip访问,会这么配
server {
listen 8080;
server_name _;
index index.php index.html index.htm default.html;
root /var/www;
}
这种想用xdebug调试就不行了(没深究,可能有其他方式),需要把server_name
配置成具体的,比如localhost
问题2
有时候我们会通过代理的方式让多个项目共用一个域名,比如:前缀为xx.com/api/user
的反向代理到8090端口,前缀为xx.com/api/admin
的反向代理到8091端口。这种想访问某个接口(xx.com/api/user/1)来调试的也不行,xdebug只会识别出端口号为8090的server_name,这时 server_name
的值肯定为 _
。所以这种情况就先别用代理了
问题3
如下图,也是常遇到的,总的来说就是程序没执行到下断点的位置
总结
这种配置方式还是挺简单的,每个项目只需配置一下容器内的根目录即可。
注意,上文提到的yii.cw.net
是我通过修改hosts自定义的域名
cuiwei@weideMacBook-Pro ~ % cat /etc/hosts
127.0.0.1 yii.cw.net
这样,不管你怎么切换网络都不影响