PhpStorm 配置 Xdebug 3,及常见问题

编辑于 2022-11-23 23:50 阅读 71

做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 要配置的很少,直接开始

第一步

1111.jpg

第二步

访问接口,触发事件。这时你会看到如下弹窗

2222.jpg

第三步

打开 PhpStorm 的设置,如下

3333.jpg

第四步

再次访问接口,就成功了

4444.jpg

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

会看到如下错误:

WX202211232321142x.jpg

这时你只需设置一下PHP_IDE_CONFIG环境变量即可,其他都是多余

root@php-fpm:/var/www/yii-demo# export PHP_IDE_CONFIG="serverName=yii.cw.net" 

常见问题

如果不成功,第一个需要确认的是9003端口是否可用

注意,先开启监听,如下

5555.jpg

然后在本机和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

如下图,也是常遇到的,总的来说就是程序没执行到下断点的位置

WX202211232337432x.png

总结

这种配置方式还是挺简单的,每个项目只需配置一下容器内的根目录即可。

注意,上文提到的yii.cw.net是我通过修改hosts自定义的域名

cuiwei@weideMacBook-Pro ~ % cat /etc/hosts
127.0.0.1 yii.cw.net

这样,不管你怎么切换网络都不影响

广而告之,我的新作品《语音助手》上架Google Play了,欢迎下载体验