Zapic's Blog
在Windows下搭建VSCode+Swoole+XDebug开发环境
2019-11-20
教程
查看标签
自古Win破事多,但是你又离不开Win的生态.
真该死.

Windows下是并没说Swoole的,因为Swoole需要某些Unix的特性.
但是我们可以通过Cygwin或者WSL膜出一个Unix环境.
在Windows下安装Swoole的教程网上都烂大街了,在这里就不再赘述,百度Google皆可.
当然,我们也有绿色版的,官方提供的,但是并没有XDebug,没法调试.
预置的是PHP7.1以及一些常用拓展.当然,还有Swoole,配的v4.2.1版本.
贴一下下载地址:下载地址(Swoole官方)

然后破事就出在XDebug.
你不能直接把Windows的XDebug塞进Cygwin或者WSL里,这些容器已经跟Win环境隔离了,没法用Win里的库.
那当然还得手动编译是吧.
编译&启用还是很简单的,也不说了.
然后就是连接到XDebug.
在VSCode里安装PHP Debug插件之后,然后指定调试用PHP位置,以便使用带Swoole的PHP运行脚本.

{
    "name": "XDebug with Swoole",
    "type": "php",
    "request": "launch",
    "program": "${file}",
    "cwd": "${fileDirname}",
    "runtimeExecutable":"/path/to/your/php.exe "
}

然后你就能开心的用PHP运行你的Swoole脚本.

坑就在连接到XDebug.
当你高高兴兴的连接到XDebug时,开始Debug时,突然脚本抛出一个错误.
你的VSCode也抛出一个错误

无法打开“script.php”: 无法读取文件(Error: 找不到文件(\cygdrive\c\Users\Zapic\Documents\GitHub\xxx\c:\Users\Zapic\Documents\GitHub\xxx\script.php))。

这样的结果,就是没法使用断点,没法定位错误位置.
那你拿个XDebug干啥?
这时就需要pathMapping了,把Cygwin的虚拟目录映射到你Windows的真实目录.

"pathMappings": {
    // "Cygwin上代码路径": "本机代码路径"
    //"${workspaceRoot}"指代当前文件夹.在这个例子"${workspaceRoot}"等价于"C:/Users/Zapic/Documents/GitHub/xxx/"
    "/cygdrive/c/Users/Zapic/Documents/GitHub/xxx/": "${workspaceRoot}"
    }

最后整段配置看起来像这样:

{
    "name": "Swoole with XDebug",
    "type": "php",
    "request": "launch",
    "pathMappings": {
        "/cygdrive/c/Users/Zapic/Documents/GitHub/xxx/": "${workspaceRoot}"
    },
    "program": "${file}",
    "cwd": "${fileDirname}",
    "port": 9000,
    "runtimeExecutable":"D:/swoole/bin/php.exe"
}

然后就没啥问题了,Everything is OK.
顺便贴一下Swoole with XDebug Zapic特供版,Swoolev4.4.12+XDebugv2.8.0,PHP7.1,配一些常用拓展,XDebug端口为59000:
下载地址(蓝奏云)
已经修复exec函数报废的问题(

2019.12.9:
突然发现直接打开并运行的文件VSCode是没法打断点的也没法捕捉错误的,只有被该文件include的才能被打断点和捕捉错误(为啥现在才发现啊喂
解决方法很简单,往php.exe目录里塞一个bat,内容如下:

@echo OFF
setlocal ENABLEDELAYEDEXPANSION

rem 将Windows形式的路径转换为Linux形式的路径,并转换盘符为Cygwin形式.
set v_params=%*
set v_params=%v_params:\=/%
set v_params=%v_params::=%
set v_params=/cygdrive/%v_params%
set v_params=%v_params%
set v_params=%v_params:"=\"%

rem 获得bat文件所在目录
set wpath=%~dp0
set lpath=%wpath:\=/%

rem 传入转换后的参数到sh,通过sh执行php,实现路径完全转换.
%wpath%sh.exe -l -c "%lpath%php.exe %v_params%"

然后把VSCode的配置里的"runtimeExecutable"指向这个bat文件,类似于:"runtimeExecutable":"D:/swoole/bin/php.bat",就可以愉快的打断点了(