环境配置最好还是看官方的文档:

https://wiki.php.net/internals/windows/stepbystepbuild_sdk_2

1. 所需工具

  1. Visual Studio 2019 Community https://visualstudio.microsoft.com/
  2. php源码 https://github.com/php/php-src/releases
  3. php sdk编译工具,最好用2.1.10,小于此版本的没有尝试成功 https://github.com/microsoft/php-sdk-binary-tools/releases
  4. 源码调试工具Visual Studio Code https://code.visualstudio.com/download

2. 安装Visual Studio

在正式编译源码之前需要安装Visual C++,但是这个比较奇怪,我没整明白,一开始下载了Visual C++ Redistributable for Visual Studio 2015,但是安装了之后,进入php_sdk_binary_tools目录,执行phpsdk-vc15-64.bat,结果还是报错:

1
Could not determine 'vc15' directory

官方文档中给的建议是安装Visual Studio

1

根据官方提示,到官网https://visualstudio.microsoft.com/下载`Visual Studio 2019 Community版本,安装时选择使用C++的桌面开发`,详细安装项保持默认就好。

3. 编译前依赖准备

解压下载好的php_sdk_binary_tools,进入目录后,会发现有四个文件:

1
2
3
4
phpsdk-vc14-x64.bat
phpsdk-vc14-x86.bat
phpsdk-vc15-x64.bat
phpsdk-vc15-x86.bat

因为我下载的是Visutal Studio 2019 x64,所以对应的是phpsdk-vc15-x64.bat,在Powershell或是cmd中运行该bat文件,看到下面的提示就表示成功了,这里我使用的php sdk版本是2.1.10,低于此版本的我在后面执行phpsdk_deps --update --branch master时总会报错。此时可以看到powershell窗口变成了$符号:

2

运行创建目录的命令

1
phpsdk_buildtree php7

3

将下载的php源码也解压到目录php7/vc15/x64下,然后进入源码目录,我这里是php-src-php-7.2.25,执行命令下载php7编译所需要的依赖组件:

1
phpsdk_deps --update --branch master

4

这里真的很坑,根据我自己的测试,这个真的很难下载,不知道是不是因为是在晚上,网络不太好,挂了代理也不行,完全下载不下来。

所以可以直接到 https://windows.php.net/downloads/php-sdk/deps 下载所需的依赖组件,注意选择和自己的vc版本适配的依赖,比如我安装的Visual Studio 2019对应的vc版本是vc15,我的系统是x64,所以就要下载https://windows.php.net/downloads/php-sdk/deps/vc15/x64/ 中的所有依赖包。

里面有很多依赖,有53个zip文件包

5

将它们全部都下载下来,然后解压到你的php-sdk-binary-tools-php-sdk-2.1.10\php7\vc15\x64\deps文件夹下,这个文件夹下本来有三个文件夹,分别是libbininclude,这个不用管。

下载并解压完成后,进入源码所在目录,执行

1
buildconf

该命令会释放configure.batconfigure.js两个文件,返回下面两行就说明没问题:

1
2
Rebuilding configure.js
Now run 'configure --help'

按照提示,继续执行:

1
configure --help

在shell中执行下面的命令来配置相关的php编译选项

1
configure --disable-all --enable-cli --enable-debug --enable-phar

如果还有别的需求,可以查看configur --help中的选项。

成功执行后就是这样的

6

然后执行nmake命令进行编译就可以了:

1
nmake

看到SAPI sapi\cli build complete,说明编译成功。

7

编译成功后,进入x64\Debug_TS目录,编译好的可执行php.exe文件就在该文件夹下,对我来说该文件夹就是``,执行

1
php -v

8

编译到这一步就完成了。

4. 配置调试环境

因为Visual Studio 2019这个软件太大了,运行占用内存也比较大,仅仅跟踪调试源码根本不需要这么多功能,所以可以用Visual Studio Code这个轻量级的IDE来替代。

打开Visual Studio Code,安装调试源码所需要的C/C++扩展:

9

然后打开源码所在目录,也就是php7\vc15\x64目录下的php-src-php-7.2.25File -> Open Folder,然后修改配置文件,Run -> Add Configuration

10

在弹出的窗口里选择C++(Windows)

11

会自动跳出launch.json,像下面这张图一样进行配置:

12

这里必须要修改的是三个地方,programargscwd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "用户自己随意定义",
"type": "cppvsdbg",
"request": "launch",
/* 这里${workspaceFolder}是工程所在的目录,也就是php-src-php-7.2.25
* program是指php可执行文件,也就是php.exe
*/
"program": "${workspaceFolder}/x64/Debug_TS/php.exe",
// 需要调试的文件,放在/x64/Debug_TS文件夹下
"args": ["pathinfo.php"],
"stopAtEntry": false,
// php二进制可执行文件所在目录
"cwd": "${workspaceFolder}/x64/Debug_TS/",
"environment": [],
"externalConsole": false
}
]
}

可以测试一下,新建一个php文件,命名为pathinfo.php

1
2
3
<?php
var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_FILENAME|PATHINFO_DIRNAME));
?>

看看能不能跟踪到pathinfo函数,先全局搜索一下该函数(右边有个放大镜),搜索PHP_FUNCTION(pathinfo),在string.c文件中,我们在该处打个断点:

13

然后Run -> Start Debugging,不出意外,可以看到停在了断点处。

14

接下来就可以愉快的调试了,不枉我捣鼓一晚上,其中最费时的就是编译前下载依赖那一块,最好就是直接去下载,用命令下载真的超级慢…

5. 参考

如果还有其他的问题,可以参考这两篇文章: