你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

sublime text 3如何调试PHP源码?C语言项目编译指南

发布时间:2026-02-04

浏览次数:0

写在前面

时光匆匆流逝,光阴如箭般飞逝,今年已然是小张身为码农的第N个年头了,因得益于世界上堪称最佳的语言(PHP),小张的头发仍旧茂密。然而项目写了一个又一个接着一个,PHP被反复使用且堪称频繁到飞起,可这些年的成长却明显大不如往昔那般了。

你有没有也在这上面犯难,而今天,让咱们换个视角去瞧PHP,把源码开启,从C这个角度去瞅PHP,看一看这个有着20年历程的庞大C项目是怎样运行的。

自此刻起始,你会升腾成 C 程序员,你能够去复习一回 C 的语法,还有结构体,以及指针和引用呢。

我改写后的内容是,也许你会这么问,瞧代码时git拉一下接着打开不就成了嘛,为何非得写个KM呢。的确如此这般能看代码,不过那称作看代码片段,并非看工程。PHP项目要兼顾、Linux、Mac平台同时还得处理线程安全,其代码含有大量宏定义。我们得借助IDE的自动跳转以及提示方可更优地阅读。

我们所需的是一个有无错误提示的那个IDE的项目,当你想要去查看一个方法然而却没办法进行跳转之时,那种感觉真的是极其难受的!

配置

这是供内部开展开发调试工作所使用的linux虚拟机,不存在该虚拟机的小伙伴能够自行筹备一台具备ssh功能的虚拟机,不管是本地虚拟机还是云平台均可满足需求,并且最好网络状况较为良好,毕竟后续要传输诸多内容。

cmake re2c

往后我们要运用Clion当作C项目的IDE,Clion得运用cmake作为项目自动化构建工具。因而我们首先要安装cmake,yum默认的cmake版本是2.8.12.2满足要求,此处就直接借由yum安装。

yum install cmake

re2c 是语法生成器

yum install re2c

gdb

此gdb版本处于过低状态,在此处需借助手动操作来安装一个与所给要求彼此契合适配的版本,而我所挑选选定的版本是7.8.2。

wget http://ftp.gnu.org/gnu/gdb/gdb-7.8.2.tar.gz
tar zxvf gdb-7.8.2.tar.gz
cd gdb-7.8.2
./configure
make
make install

代码拉取

于众多php版本之中挑选出一个版本来,在此处我所选用的乃是7.1.33版本,存在着若干个理由。

1.项目中使用了这个版本。

2.php7针对内核实施了诸多改动,先前使用的php5已然不契合学习开展了。

后续会介绍的书籍,其基于的php7.0的版本,与php7.1比较接近。

4.php8目前还在测试,且和php7比较接近。

请留意:在本地以及远程一并拉取一份,需让tag保持相同,在两边均要去执行如下的cmake改造。

git clone https://github.com/php/php-src.git
cd php-src
git tag -l
git checkout php-7.1.33

Clion配置

工欲善其事那就必须先利其器,若要看代码那就得选一个好的 IDE,我使用多年所以我推荐使用全家桶里面的 Clion。一般而言我们不会直接拿 Linux 来做桌面系统,在此使用 Clion 的远程部署功能来配合做环境部署。我的本地是环境,构建编译在远端去进行。(用 WSL 也是同样的情况sublime text 3编译php,然而 PHP 的 Git 仓库太大在 WSL 中做 Git 操作会非常卡,这应该是 WSL 文件系统的 bug)。

PHP cmake改造

多数同学无法借助Clion去查看PHP源码,这主要是因为这一步骤起到了阻碍作用。PHP项目长期以来一直将某种工具用作项目自动管理工具,只因有着悠久的历史。可是Clion并不支持这种情况,它要求项目借助cmake来去构建,所以我们得针对php的源码开展cmake构建改造工作。

可以获取到,那个网址是https://wiki.php.net//cmake 的官网,有一份关于cmake的改造文档。

在https://.com/gloob/php - cmake这个链接处,也能够找到与之相对应的代码呀。

可是,这个文档以及代码,实在是太过陈旧了,想来应当是处于PHP5那时候的代码。我针对这个项目实施了某些升级,达成了与PHP7的兼容(鉴于水平存在局限所以或许会有问题,非常欢迎大家提PR呢)。

将如下命令于本地予以执行,克隆php - cmake项目,进行分支切换,把php - cmake/cmake里的全部文件复制到php源代码目录,留意目录合并。

git clone https://github.com/bobzhangyong/php-cmake
cd php-cmake
git checkcout feature/support_php_7_1
cp -r cmake/* ../php-src //这里是php源码的路径

配置

这里对远程机器的信息予以设置,将相关工具的路径予以设置。通常情况下它会自行进行识别,要是无法识别的话能够手动去输入。它会对版本展开检查,默认状态下的版本似乎都是不正确的,需要自己去升级。

配置

这里要去设置用于代码同步的目录,设置妥当之后点按√进而设置成默认。达成上面的设置之后,这里或许会默认显现出一个信息,然而里面的path处于/tmp/目录的下面,你能够删除自身的配置,也能够直接对path进行修改使其变为你所需的项目目录。

特别留意:在此处的本地路径位置要是向上的状况下会需要运用斜杠去分割路径,并非那种预设的反斜杠不然的话在开展cmake构建这项活动的时候就会给出提示表明目录没办法找到。

于其中能够进行设置,不让.phpt文件被同步,此乃php项目里的测试用例文件。(于我们拉取代码之际,实际上已然会手动促使本地与远程机器的文件达成一致,然而Clion仍旧会自行同步一回,设置此项能够加快同步速度)

同步代码到。首次同步真的很慢,你需要耐心等待。

执行cmake构建,看看报错不?

因为PHP cmake构建会于远端产生一些文件,所以那部分.c、.h类文件若在本地不存在,将致使打开代码时没有提示,还会出现各种各样的报错,故而我们得把这些文件同步到本地。

于此处运用Size广告而非其他方式进行选择的比对,相较于在别处,速度会稍快一些,而在此处进行这样的操作时,速度呈现出较慢的态势,所以还请耐心等待片刻。

完成分析之后,便能够瞧见远程较本地多出的文件,我们要将它们同步至本地,处于最上面的。

.克莱恩... 无需进行同步,可轻点红色边框里的箭头予以取消。 随后点击同步。

打开.c看看源码,是不是干干净净一个红线都没有。

断点

肯定只是光看是不行的sublime text 3编译php,最好要能够把代码运行起来,打个断点能够更深入地去了解运行机制,你可以使用gdb去进行断点操作,我这里由于用上了clion所以就直接采用clion的断点功能,因为这个用起来会更加直观。

1、准备一个yong.php 写一点代码用来做测试文件。

2、这里配置运行配置。

3、设置 和

4、把yong.php文件同步到远端。执行以下看看。

5、打断点。真的很爽~~

开始阅读目录结构

PHP项目有很多目录,大概功能如下:

├── CMake //用于cmake构建的文件,我们做cmake 改造的时候拷贝进去的。
├── TSRM //线程安全相关,你如果刚开始看就先忽略 不要看了
├── Zend //Zend内核的代码
├── appveyor //一些脚本 忽略
├── build //autoconf 构建用脚本 忽略
├── cmake-build-debug //cmake构建后产物 忽略
├── ext //扩展目录,这块可以找感兴趣的扩展看一下
├── main //主要的php逻辑 
├── netware //用于兼容Netware操作系统的 直接忽略
├── pear //忽略
├── sapi //入口部分,fpm cgi 都在这里,我们可以先看一下cgi目录
├── scripts //脚本忽略
├── tests //测试用例 忽略
├── travis //构建用 忽略
└── win32 //兼容windows系统 忽略

其实与源代码有所关联的,仅仅是这几个目录,于Clion里被标记成和目录,以便IDE去构建索引。

main
ext\standard
sapi\cli
Zend

从哪里开始

准备工作均已就绪,难道还有理由不去看代码吗?要是你依旧不清楚从何处着手,那么我建议从main函数起始吧。它处于sapi\cli\.c的末尾位置。附上一张图片,能够与源代码一同对照查看。图片源自:

最后推荐一本书 秦朋 的 《PHP7内核剖析》

如有侵权请联系删除!

13262879759

微信二维码