探索PHP源码时,定制编译是挺重要的,毕竟预先编译发行版是没有调试功能的。
首先安装编译工具(debian系统):
$ sudo apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev
这些工具也不需要记,https://github.com/php/php-src上都有。
编译
以下是自用的编译脚本:
$ make clean \
&& PREFIX_DIR=$PWD/output \
&& rm -rf $PREFIX_DIR \
&& ./buildconf -f \
&& INI_DIR=$PREFIX_DIR/ini \
&& ./configure \
--enable-debug \
--prefix=$PREFIX_DIR \
--with-config-file-path=$INI_DIR \
&& echo $PREFIX_DIR \
&& echo $INI_DIR \
&& sleep 5 \
&& make \
&& make install \
&& mkdir -p $INI_DIR \
&& cp $PWD/php.ini-production $INI_DIR/php.ini \
&& EXT_DIR=`$PWD/output/bin/php-config --extension-dir` \
&& echo $EXT_DIR \
&& echo "extension_dir=${EXT_DIR}" >> $INI_DIR/php.ini
./configure脚本可配的参数比较多,根据需要添加减少,./configure --help查看所有选项。
如果使用macos的m系列芯片,还需要添加--with-iconv=/opt/homebrew/opt/libiconv。通过brew安装iconv的话,可以根据brew info libiconv来获取路径。
如果要用composer测试,需要再加几个,--with-openssl、--with-openssl-dir=/usr/include/openssl、--enable-phar、--enable-filter和--enable-iconv,记得配置phar.readonly=Off。
调试
工具:vscode。运行调试配置,.vscode/launch.json:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "debug php source",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceRoot}/output/bin/php",
            "args": ["-f", "${workspaceRoot}/phps/hello.php"],
            "stopAtEntry": true,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "lldb",
            "preLaunchTask": "make"
        }
    ]
}
如果不需要前置任务,preLaunchTask不用设置。不过为了方便修改源码,我给添加了一个编译安装任务,preLaunchTask的值为.vscode/tasks.json的label值,.vscode/tasks.json配置如下,command根据实际填写:
{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "make",
            "command": "cd /xxx/php-src && make && make install",
            "args": [
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}
接下来,创建phps/hello.php,添加断点,点击Start Debugging即可开启PHP源码的大门。