后端开发干货:PHP源码阅读技巧
作者:张勇,腾讯IEG后台开发工程师
时光匆匆 光阴似箭,今年已经是小张做码农的第N个年头了,得益于世界上最好的语言(PHP),小张的头发依旧茂密。但是项目写了一个又一个,PHP、swoole用到飞起,这些年的成长却大不如从前。
你是否也纠结于此,今天让我们换个角度看PHP,打开源码从C的角度看PHP,看一眼这个具有20年历史的庞大C项目是如何工作的。
从这一刻开始,你将荣升为C程序员,你可以去温习一下C的语法、结构体、指针和引用。
你也许会问,看个代码git拉一下用sublime打开不就好了吗,为什么要写个KM。确实这样可以看代码,但那叫看代码片段,不是看工程。PHP项目需要兼容Windows、Linux、Mac平台还要处理线程安全,其代码包含大量宏定义。我们需要借助IDE的自动跳转和提示才能更好的阅读。
我们需要一个IDE无错误提示的项目。(当你要看一个方法却无法跳转的时候,真是太难受了)
devCloud是内部用于开发调试的linux虚拟机。没有的小伙伴可以自己准备一台可以ssh的CentOS虚拟机,本地虚拟机或云平台都可以。(最好网络能好一点,后面要传不少东西)
后面我们需要使用Clion作为C项目的IDE,Clion需要使用cmake作为项目自动化构建工具。所以我们首先需要安装cmake devCloud上的yum默认的cmake版本为2.8.12.2符合要求,这里就直接用yum安装。
re2c 是语法生成器
devCloud的gdb版本过低,这里需要手动安装一个符合要求的版本,我选了7.8.2
选择一个php版本,这里我用7.1.33版本。 有几个理由:
1.项目中使用了这个版本。
2.php7对内核做了大量的改动,之前的php5已经不适合学习了。
3.后续会介绍的书籍也是基于php7.0的版本和php7.1比较接近。
4.php8目前还在测试,且和php7比较接近。
注意:本地远程都拉取一份,要保持tag一致,两边都要执行下面的cmake改造
工欲善其事必先利其器,要看代码需要选一个好的IDE,多年使用PhpStorm的我推荐使用全家桶里面的Clion。一般我们不会直接使用Linux做桌面系统,这里使用Clion的远程部署功能配合devCloud做环境部署。我的本地是Windows环境,构建编译在远端的devCloud进行。(用WSL也是一样的,但是PHP的git仓库太大在WSL中做git操作非常卡,应该是WSL文件系统的bug)
这一步是阻止大部分同学使用Clion查看PHP源码的主要原因。PHP项目由于历史悠久一直使用autoconfig作为项目自动管理工具。然而Clion并不支持autoconfig,它需要项目使用cmake构建,因此我们需要对php的源码做cmake构建改造。
https://wiki.php.net/internals/cmake 官网有一份cmake的改造文档。
https://github.com/gloob/php-cmake github上也有对应的代码。
但是这个文档和代码都太老了,应该是PHP5年代的代码。我对这个项目做了一些升级,兼容了PHP7(水平有限可能存在问题,欢迎提PR)。
在本地执行如下命令,clone php-cmake项目,切换分支,拷贝php-cmake/cmake中的所有文件到php源代码目录。注意目录合并。
这里设置远程机器的信息,设置相关工具的路径。一般会自己识别,如果不能识别可以手动输入。会检查版本,默认devCloud上的版本好像都不正确需要自己升级。
这里需要设置代码同步的目录,设置好以后点按√好设置为默认。完成上面Toolchains设置后,这里可能默认出现一个devCloud的信息,但是Mappings 里面的Deployment path是/tmp/目录下面,你可以删除自己配置,也可以直接修改Deployment path到你需要的项目目录。
注意:这里的Local path如果是windows上需要使用/分割路径,不是windows默认的\\,否则在执行cmake构建的时候会提示目录无法找到。
在Options里面可以设置 不要同步.phpt文件,这是php项目中的测试用例文件。(我们在拉代码的时候其实已经会手动保证本地和远程机器的文件一致,但是Clion还会自己同步一次,设置这个可以加速同步速度。)
同步代码到devCloud。首次同步真的很慢,你需要耐心等待。
执行cmake构建,看看报错不?
由于PHP cmake构建会在远端生成一些文件,我们需要同步这些文件到本地,否则打开代码会因为这部分.c .h文件不存在导致代码没有提示,各种报错。
选择比对方式 用Size adn Timestamp 会快一点,这里比较慢,耐心等待一下。
分析完成以后,就可以看到远程比本地多的文件了,我们需要把他们同步到本地。最上面的.clion.source.upload.marker 不需要同步,可以点击红框中的箭头取消。 之后点击同步。
打开php_cli.c看看源码,是不是干干净净一个红线都没有。
光看肯定是不行的,最好能把代码跑起来 打个断点可以更深入的了解运行机制。你可以用gdb去断点。我这里既然用了clion就直接用clion的断点功能,用起来更直观。
1、准备一个yong.php 写一点代码用来做测试文件。
2、这里配置运行配置。
3、设置 arguments 和 Working directory
4、把yong.php文件同步到远端。执行以下看看。
5、打断点。真的很爽~~
PHP项目有很多目录,大概功能如下:
其实和源代码相关的 只有这几个目录, 在Clion中标记为Source和Header目录方便IDE构建索引。
准备工作都做好了,还有借口不看代码吗?如果你还是不知道从哪里开始,那我推荐从main函数开始吧。 它在sapi\\cli\\php_cli.c的最后面。 附图一张可以和源代码结合起来看。 图片引自:https://github.com/pangudashu/php7-internal/blob/master/1/base_process.md
最后推荐一本书 秦朋 的 《PHP7内核剖析》
如何利用vscode高效开发PHP
用最近使用PhpStorm的激活码到期了,就琢磨着换一个编辑器。vscode评价挺好的而且轻量级免费开源,所以决定vscode开发PHP。
- vscode介绍
- vscode常用的PHP插件
- 安装插件
- vscode 配置自己习惯的快捷键
1.vscode介绍
Visual Studio Code简称为VS Code习惯称为vscode,是微软公司的一款跨平台开源免费,轻量级但功能强大的源代码编辑器。
2.vscode常用PHP的几个插件
3.安装插件
在插件商店中搜索上面提供的几个vscode插件,点击”安装“,等待插件安装完成,这个过程会很快。安装PHP Debug 插件会稍微麻烦些,不用的小伙伴也可以跳过。也可以参考我的另外一篇文章
打开vscode插件商店并安装插件
vscode已安装插件列表
插件安装完成就可以开发是开发了,下图是我测试的截图
4.vscode 配置自己习惯的快捷键
配置自己习惯的快捷键这里我就不多说,也可以参考我另一篇文章
也可以自行网上搜索。小伙伴有更好的vscode php开发配置欢迎留言。
PHP开发调试神器:PhpStorm+Xdebug
一、原理:
Xdebug是一款php调试插件,支持在Windows或Linux上进行远程调试。在php文件运行时,通过TCP协议发送调试信息到远程端口,IDE在收到调试信息时,可以向Xdebug发送单步运行,中止运行,运行等命令。此插件还可以进行代码覆盖率的统计,有兴趣的小伙伴可以一起交流。
二、需要的环境:
1. 已搭建好的web服务器,本例使用的是Apache+PHP;
2. 一款支持Xdebug远程调试的IDE,本例使用的是PhpStorm7,IDE下载地址:http://www.jetbrains.com/phpstorm/ ;
3. 一款与你的php对应版本的Xdebug。
三、 服务端配置
1. 下载与PHP对应版本的Xdebug:
方法一:
如果你知道所使用的php版本,即可到官网直接下载对应版本的Xdebug,官网地址:http://Xdebug.org/download.php 。
方法二:
a. 如果你不知道你的PHP版本,请echo phpinfo();
b. 按Ctrl+A复制整个页面;
c. 访问 http://Xdebug.org/wizard.php ,将复制的内容粘贴到文本框中,如下图。
d. 点击页面下面的“Analyse my phpinfo() output”按钮,页面会自动分析你的php版本,如下图:
e. 点击Download后面的链接,下载与你机器配置的php相匹配的Xdebug版本。
f. 将下载的dll文件保存到PHP文件路径中的ext文件夹中。
2. 配置php.ini文件,连接Xdebug。
a. 打开PHP文件目录下的配置文件php.ini
b. 在文件的末尾添加如下设置:
注:第一行是加载Xdebug.romote_enable是开启远程调试,下面是远程调试的参数,ip、端口、识别字符串、自动远程调试。
c. 保存文件,重启apache。
d. 在CMD里输入 E:\\php\\php.exe -m 看到[Xend Modules]中出现如下字样Xdebug,说明开启成功。如下图
e. 至此,服务器端配置完毕。
注意:Xdebug就加载成功后,访问网站可能会会慢一些,原因是因为你开启了自动远程调试,每一次访问都会连接一下定义的ip和端口。
四、客户端配置:
1. 打开phpStorm,点击进入File>Settings>PHP>Servers。
2. 点击“+”,填写服务器端的相关信息,name填127.0.0.1,host填127.0.0.1,port填80,debugger选Xdebug,如下图:
3. 点击进入File>Settings>PHP>Debug。
4. 看到右侧Xdebug选项卡,Debug port填9000,其他默认
5. 点击进入File>Settings>PHP>Debug>DBGp Proxy
6. IDE key 填 phpStorm(与php.ini文件中的Xdebug.idekey值相同),host 填127.0.0.1,port 填80
7. 点OK退出设置。
8. 点击phpStorm界面右上角像电话一样的按钮,打开监听,如下图:
9. 如果变为绿色,则为开启监听成功,如下图:
五、开始调试
1. 打开php文件
2. 设置断点,如下图:
3. 点击run>debug,或者按Alt+Shift+F9,如下图:
4. 在弹出的对话框中选则带有php图标的php文件,如下图:
5. 底部会出现调试信息,如下图:
6. 按F8执行Step Over(单步进入函数),按F7执行Step Into(单步跳过函数),更多操作如下图:
7. 鼠标移至参数上之后,会出现当前的值,如下图:
8. 点击run>stop或者按Ctrl+F2,停止调试。
查看更多内容:MySQL性能优化详解,希望可以帮助到你。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。