0x00 从源码编译安装php

使用的环境:Ubuntu 18.04

从php.net上下载 php7.3.7的源码,解压到本地。

安装编译php所需要的依赖及软件:

sudo apt-get install gcc
sudo apt-get install libxml2-dev
sudo apt-get install openssl 
sudo apt-get install libssl-dev
sudo apt-get install make
sudo apt-get install curl
sudo apt-get install libcurl4-gnutls-dev
sudo apt-get install libjpeg-dev
sudo apt-get install libpng-dev
sudo apt-get install libmcrypt-dev
sudo apt-get install autoconf

进入php目录 执行

./buildconf --force
./configure --prefix=/usr/local/php --enable-fpm
make
make install

即可编译安装完成php

0x01 编写一个简单的php扩展

PHP 提供了一个工具可以生成扩展文件的框架,进入ext目录:

ext_skel.php

./ext_skel.php --help

image-20190718102619619

可以看到这个工具的基本用法,这里我们使用

./ext_skel.php --ext annevi

创建一个名为 annevi 的扩展,进入annevi文件夹,首先看配置文件 config.m4

config.m4

image-20190718102918978

PHP_ARG_WITH和PHP_ARG_ENABLE这两个宏用来配置configure选项,一个配置需要外部依赖的,另一个配置不需要。

php_annevi.h

image-20190718103255208

该文件就是我们编写的c扩展的头文件,在这里我们作了我们要编写的函数的声明。

PHP_FUNCTION(annevi_hello);

annevi.c

该文件即是我们要编写的扩展的函数主体

annevi_functions[]数组中添加我们需要编写的函数名:PHP_FE(annevi_hello,NULL) 注意没有分号

image-20190718104017420

编写函数:

image-20190718105056259

编写了annevi_hello函数,该函数打印出两句话。

0x02 编译php扩展

首先使用phpize来生成编译配置文件:

phpize

编译扩展:

./configure --with-php-config=/usr/local/php/bin/php-config

生成Makefile,使用make命令编译安装

make
make install

0x03 启用扩展

查看phpinfo,找到php.ini文件的加载位置:

php -r "phpinfo();" | grep php.ini

image-20190718105849304

将 php源码下的 php.ini-production复制到 /usr/local/php/lib

cp php.ini-production /usr/local/php/lib/php.ini

修改php.ini,添加extension=annevi.so 成功启用annevi扩展。

0x04 测试

image-20190718110214348

image-20190718110202206

0x05 过程总结

apt-get install autoconf
./buildconf --force
./configure
make 
make install
cd ext/
./ext_skel.php --ext annevi
cd annevi/
vim config.m4
-----------------
#去掉注释
-----------------
vim php_annevi.h
-----------------
#添加函数声明
-----------------
vim annevi.c
-----------------
1.在函数的数组中增加我们自定义的函数
2.编写函数
-----------------
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install

cp php-src/php.ini.production /usr/local/php/lib/php.ini 创建php.ini 文件
vim php.ini
----------------
extension=annevi.so
----------------
php -m