探索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
源码的大门。