PHP7内核学习--2安装和调试

windown版安装就不多做解释了,下载解压就行
以Linux环境为例来进行安装。

编译安装

首先下载PHP 7。在http://php.net/releases/上能够获取各个版本的PHP源码和修改记录.7.1.0版本为例,下载源码包并编译安装(源码包URL为
http://cn2.php.net/distributions/php-7.1.0.tar.gz)。
wget http://cn2.php.net/distributions/php-7.1.0.tar.gz
tar -zxvf php-7.1.0.tar.gz
cd php-7.1.0
./configure --prefix=$HOME/php7/output --enable-fpm
make && make install

注意:默认情况下,make install命令会把执行文件和库文件安装到/usr/local/bin和/usr/local/lib目录。为了后续方便,使用–prefix将PHP 7安装到当前目录的output目录下,同时安装php-fpm。
到此,完成了php-7.1.0的编译安装,生成的可执行文件php-fpm在sbin中,其他部分在bin目录下:
在这里插入图片描述
PEAR(PHP Extension and Application Repository,PHP扩展与应用库),是PHP官方开源类库,可以使用pear list列出所有已经安装的包。通过pear install可以安装需要的包。
PECL是PHP的扩展库,可以通过PEAR的Package Manager的管理方式来下载和安装扩展代码。
以安装yaconf为例:
在这里插入图片描述
./php-config
phpdbg是一个轻量级,具有丰富功能的调试平台。PHP 5.4以上版本支持,比如可以使用它查看opcode:
在这里插入图片描述
phpdbg的其他功能可以通过phpdbg–help查看。
phpize命令用来动态安装扩展,如果在安装PHP时没有安装某个扩展,可以通过这个命令随时安装。

使用GDB调试PHP 7

GDB是一个由GNU开源组织发布的、UNIX/Linux操作系统下的、基于命令行的、功能强大的程序调试工具。当程序发生coredump,通过GDB可以从core文件中复现场景,定位问题。

这里演示一下如何通过GDB来调试PHP程序。首先编写一段简单的代码test.php:

$a = '1';
ehco $a;

下面开始进行GDB调试,运行gdb php:

gdb php
(gdb)
//使用b命令在main函数入口增加断点:
(gdb) b main
//使用r命令运行test.php:
(gdb) r test.php

vld扩展

在学习和研究PHP 7的过程中,经常需要查看opcodes,除了上文提到的phpdbg可以查看,另外还有一个vld扩展也非常好用,下面介绍下vld扩展。
PHP代码的执行实际上是在执行代码解析后的各种opcode。通过vld扩展可以很方便地看到执行过程中的opcode。扩展可以从https://github.com/derickr/vld下载安装,下面是安装示例:

到这里,扩展就安装完成了,接下来只需要在PHP的配置文件php.ini中启用该扩展即可:
extension=vld.so
然后执行下边的命令php -m | grep vld
看到有vld的输出,即表示扩展启用成功。
现在来写一段简单的PHP代码,看看生成的opcode:

$str = "hello php7";
var_dump($str);

保存这段代码为vld.php,然后在命令行执行:
php -dvld.active=1 vld.php

从上边的输出可以看到这段代码一共有5个opcode(这里输出的opcode均省略了ZEND_前缀,例如ASSIGN的实际定义为ZEND_ASSIGN,其值为38)

vld扩展有下边几个参数。
1)vld.active:是否在执行PHP的同时激活vld——1激活,0不激活(默认不激活)。
2)vld.execute:是否输出程序的执行结果——1输出,0不输出(默认输出)。
3)vld.verbosity:显示更详细的opcode信息,开启后可以显示每个opcode的操作数的类型等信息。
例如:
3 0 E > ASSIGN OP1[IS_CV !0 ] OP2[IS_CONST (0) ‘hello+php7’ ]
4)vld.skip_prepend:是否跳过php.ini配置文件中auto_prepend_file配置项指定的文件,默认为0,即不跳过包含的文件。vld.execute为0时有效;
5)vld.skip_append:是否跳过php.ini配置文件中auto_append_file指定的文件,默认为0,即不跳过包含的文件。vld.execute为0时有效;
6)vld.format:是否启用自定义输出格式——1启用,0不启用(默认不启用);
7)vld.col_sep:自定义输出格式间隔符,vld.format为1时有效;
8)vld.save_dir:指定文件输出的路径,默认路径为/tmp;
9)vld.save_paths:控制是否输出dot语言文件,默认为0,表示不输出;
10)vld.dump_paths:控制是否输出分支及路径信息——1输出,0不输出(默认输出)。

小知识
dot是一种描述图形的语言,可以由Graphviz工具包来绘制dot描述的图形。vld扩展可以直接通过命令来生成dot脚本,现以下面的代码来演示一下:
在这里插入图片描述
在命令行执行以下命令:
在这里插入图片描述
在命令行执行以下命令:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值