工欲善其事必先利其器
PHP的编译与安装
基于PHP 7.1的版本。具体步骤如下:
下载源代码并解压
[root@bogon src]# pwd
/usr/local/src
[root@bogon src]# wget http://jp2.php.net/distributions/php-7.1.26.tar.gz
[root@bogon src]# tar -xzvf php-7.1.26.tar.gz
[root@bogon src]# cd php-7.1.26
[root@bogon php-7.1.26]# pwd
/usr/local/src/php-7.1.26
编译前配置
与其他软件安装相同,PHP也使用./configure命令进行编译前选项配置,在配置过程中可能会提示缺少某些依赖库或组件的提示,基本上上百度谷歌一下csdn就解决了,本篇不赘述。如下是我的配置命令:
[root@bogon php-7.1.26] ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc
--enable-pdo --with-pdo-mysql --with-mysql-sock=/var/lib/mysql/mysql.sock
--enable-mbstring --enable-fpm --enable-debug --enable-maintainer-zts --enable-embed
不难发现,除去路径,MySQL和开启fpm等常规配置,还有三个配置需要注意:
- --enable-debug: 顾名思义,就是打开调试模式
- --enable-maintainer-zts: 打开PHP的线程安全机制,对于调试PHP源代码来说不是必须,但对于我们开发线程安全的扩展则是必须的。
- --enable-embed: 主要用在你做php的嵌入式开发的场景中,把php作为apache的一个module进行编译,得到libphp5.so。对于一般的调试和开发扩展不是必须。
PHP使用C语言写的,其本质是个二进制ELF格式的执行文件。此次配置的实质有两个:
- 打开gcc的“-g -O0”的编译选项,禁止gcc编译时进行优化,
- 在二进制文件中保留PHP执行不需要,但调试必须的信息,如变量名称,函数名称,二进制代码和源代码的对应关系等。
编译、测试和安装
[root@bogon php-7.1.26] make
[root@bogon php-7.1.26] make test //很耗时,可选步骤,目的单元测试
[root@bogon php-7.1.26] make install
[root@bogon php-7.1.26] cd /usr/local/php/etc
[root@bogon etc]# pwd
/usr/local/php/etc
[root@bogon etc]# cp /usr/local/src/php-7.1.26/php.ini-development ./php.ini
[root@bogon etc]# cp php-fpm.conf.default php-fpm.conf
安装完成后,可执行文件php、php-config、phpize位于/usr/local/php/bin中,php-fpm位于/usr/local/php/sbin中,为使用方便,可将其软链接到/usr/bin或/usr/local/bin中。
Vim及其相关插件配置
在Windows中查看源代码首推的source insight,在Linux通常使用Vim+Ctags+TagList+NERDTree实现,开始阶段可能会感觉不如鼠标点来点去方便,但熟悉之后,会觉得非常好用。
Ctags的安装
Ctags实际上是一个独立的软件程序,不是Vim的插件,它的安装遵循一般Linux安装的步骤流程:
[root@bogon src]# pwd
/usr/local/src
[root@bogon src]# wget https://jaist.dl.sourceforge.net/project/ctags/ctags/5.8/ctags-5.8.tar.gz
[root@bogon src]# tar -xzvf ctags-5.8.tar.gz
[root@bogon ctags-5.8]# ./configure
[root@bogon ctags-5.8]# make
[root@bogon ctags-5.8]# make install
[root@bogon ctags-5.8]# whereis ctags
ctags: /usr/bin/ctags /usr/local/bin/ctags /usr/share/man/man1/ctags.1.gz /usr/share/man/man1p/ctags.1p.gz
// 说明安装成功
TagList的安装与配置
TagList不同于ctags,它是vim的一个插件,因此遵循Vim插件安装流程。
首先下载,解压,如下:
[root@bogon src]# wget https://jaist.dl.sourceforge.net/project/vim-taglist/vim-taglist/4.6/taglist_46.zip
[root@bogon src]# unzip taglist_46.zip
[root@bogon src]# ll
总用量 52
drwxr-xr-x. 2 root root 25 3月 14 19:25 doc
drwxr-xr-x. 2 root root 25 3月 14 19:25 plugin
-rw-r--r--. 1 root root 51455 2月 27 2013 taglist_46.zip
注意,doc和plugin是vim插件标配的两个目录,将其拷贝到对应的vim目录下是安装vim插件的第一个过程。我平时看代码一般不会用root权限,因此我在配置之前切换我的一个普通账户,并置于根目录处,如下图。
将taglist解压后doc下和plugin下taglist.txt和taglist.vim文件拷贝到/home/ctl/.vim目录下的doc和plugin文件夹下。如果没有.vim目录则新建一个。 如下图。
[ctl@bogon ~]$ pwd
/home/ctl
[ctl@bogon ~]$ tree .vim
.vim
├── doc
│ └── taglist.txt
└── plugin
└── taglist.vim
2 directories, 2 files
至此,taglist安装完成,实际上这个时候已经可以使用taglist了,为了优化使用,有几个配置可写入vim的配置文件。
切成root权限,打开vim /etc/vimrc,添加如下内容。
"Taglists
let Tlist_Enable_Fold_Column = 0
let Tlist_Show_One_File = 1
let Tlist_Exit_OnlyWindow = 1
let Tlist_Use_Right_Window = 1
NERDTree的安装
NERDTree同TagList一样,也是vim的一个插件,所以安装流程同Ctags,下载解压后,将plugin和doc下相应的文件拷贝到.vim目录中的plugin和doc目录下。
[root@bogon src]$ wget https://www.vim.org/scripts/download_script.php?src_id=17123
[ctl@bogon ~]$ pwd
/home/ctl
[ctl@bogon ~]$ tree .vim
.vim
├── doc
│ ├── NERD_tree.txt
│ └── taglist.txt
└── plugin
├── NERD_tree.vim
└── taglist.vim
2 directories, 4 files
NERDTree安装完成。
使用Vim查看PHP源代码
进入PHP源码目录,并解析源文件生成tags标识符记录文件:
[ctl@bogon php-7.1.26]$ pwd
/usr/local/src/php-7.1.26
[ctl@bogon php-7.1.26]$ ctags -R . // 此命令执行将生成tags符号文件
随意打开个文件,vim sapi/cli/php_cli_server.c,开启NerdTree和tglist,如下图所示效果图:
NERDTree和TagList的具体使用,上百度谷歌一下csdn即可,此处不赘述。
用GDB调试PHP程序
gdb作为Linux的标配,无需额外专门安装,如果太旧的系统,可考虑升级到最新版。这里用一个最简单的php程序文件,test.php 示例一下:
<?php
echo 'abcdef' . PHP_EOL;
执行如下:
[ctl@bogon documents]$ /usr/local/php/bin/php test.php
abcdef
[ctl@bogon documents]$
用gdb调试此程序,简单查看php内核Zend的执行流程:
下面说明一下每一步的操作含义:
1、启动gdb,开始调试php的二进制可执行文件;
2、设置断点,ZEND_SPEC_CONST_HANDLER就是echo语句,在Zend内部的实现;
3、执行test.php脚本文件,文件名作为参数传入;
4、在断点处,查看此时的栈帧情况;
5、继续执行test.php脚本;
6、执行结果。
此外,gdb调试时,可能会报缺少调试信息的错误,不要紧,按提示安装即可。
如下图,我遇到的错误,用root执行use后面的命令 即debugin-install … 就可以了。