php 扩展库 开发环境,PHP 扩展开发环境搭建

环境搭建步骤:

创建 docker 容器

(原因:①. Mac下环境配置有坑,不好弄(其实就是搞不定-_-||);②. 不想搞乱 Mac 环境;③. docker 容器可以随时删除和重建)

下载PHP源码,并源码安装 PHP(源码必须下,后面扩展开发还有用)

通过ext目录下ext_skel脚本生成扩展的基本框架:./ext_skel --extname;

1.环境配置说明:

我的环境:Mac + Docker + Ubuntu + PHP7.1.26 + bg-sync

Mac、Docker、Ubuntu 这三个不用解释,php 版本这个没有限制,只是需要注意,生成扩展基本框架的脚本 7.1 版本跟 7.3 的有点区别。

重点说这个 bg-sync ,这是我用到的一个 Docker 容器,用来同步容器内和宿主机(Mac)的文件,否则只能用 vim 在容器中进行编辑。(说白了就是技术渣,用不惯 vim .)

2.创建 Docker 容器

因为这里会用到 2 个容器,一个是 Ubuntu 容器,一个是用于同步文件的 bg-sync 容器,所以用 docker-compose 去组织容器

目录结构:

|---php-ext

| |---build

| |---Dockerfile //用于生成 Ubuntu 镜像

| |---php-src //php 源码

| |---...

| |--- docker-compose

docker-compose.yml 文件:

version: '3'

# 挂载数据卷

volumes:

php-ext:

services:

ubuntu-php-ext:

build: ./build/

volumes:

- php-ext:${EXTSPACES}

stdin_open: true

tty: true

# this service sync a local dir in your computer with a dir on the app server side

bg-sync:

image: cweagans/bg-sync

volumes:

- ${WORKSPACES}:/source

- php-ext:${EXTSPACES}

environment:

SYNC_VERBOSE: 1

SYNC_DESTINATION: ${EXTSPACES}

SYNC_MAX_INOTIFY_WATCHES: 40000

privileged: true

./build/Dockerfile 文件

FROM ubuntu

# install compile tool

RUN apt-get update && apt-get install -y \

libxml2 \

libxml2-dev \

autoconf

.env 文件

# 扩展源文件目录(宿主机)

WORKSPACES=./php-src

# 扩展源文件目录(容器内)

EXTSPACES=/root/php-src

3.下载源码并解压,重命名

源码下载地址:https://www.php.net/releases/

解压,并重命名为 php-src ,按照步骤 2 中的文件目录结构复制到目录下即可。

4.构建 docker-compose

·切换到 php-ext目录下

·docker-compose up --build

等待出现下图即成功

6ae08a65cd99

image.png

5.源码安装 php

·进入 Ubuntu 容器

·切换到/root/php-src目录下

·依次运行一下命令进行源码安装:

./configure --enable-debug

make

sudo make install

make clean(次步非必须)

如图所示,即为安装成功:

6ae08a65cd99

image.png

6.创建一个简单的扩展

6.1PHP提供了一个命令用于生成扩展的基本文件架构,只要调用该命令即可。

cd php-src/ext/

./ext_skel --extname=aatest //aatest为扩展的名称

在命令行中出现如下提示,即为成功

root@544e81fb3734:~/php-src/ext# ./ext_skel --extname=aatest

Creating directory aatest

Creating basic files: config.m4 config.w32 .gitignore aatest.c php_aatest.h CREDITS EXPERIMENTAL tests/001.phpt aatest.php [done].

To use your new extension, you will have to execute the following steps:

1. $ cd ..

2. $ vi ext/aatest/config.m4

3. $ ./buildconf

4. $ ./configure --[with|enable]-aatest

5. $ make

6. $ ./sapi/cli/php -f ext/aatest/aatest.php

7. $ vi ext/aatest/aatest.c

8. $ make

Repeat steps 3-6 until you are satisfied with ext/aatest/config.m4 and

step 6 confirms that your module is compiled into PHP. Then, start writing

code and repeat the last two steps as often as necessary.

此时,可以按照提示步骤运行,也可继续跟随本文后面的步骤,意思相同。

成功之后打开 php-src/ext/aatest目录,上面的命令已经帮我们生成好了一些文件。

最主要的是 config.m4, php_aatest.h, aatest.c 这三个文件。

config.m4 //编译配置文件

php_aatest.h //扩展头文件

aatest.c //扩展源码

6.2修改config.m4

// 注意:dnl 开头的内容为注释

PHP_ARG_ENABLE(aatest, whether to enable aatest support,

Make sure that the comment is aligned:

[ --enable-aatest Enable aatest support])

if test "$PHP_AATEST" != "no"; then

PHP_NEW_EXTENSION(aatest, aatest.c, $ext_shared)

fi

6.3修改 aatest.c

PHP_FUNCTION(confirm_aatest_compiled)

{

php_printf("hello aatest!\n");

return;

}

6.4编译扩展

cd aaetest

phpize

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

make

sudo make install

----------------------------------------------------------------------

成功提示:

Build complete.

Don't forget to run 'make test'.

Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20160303/

其中第三步,php-config 的路径来自于源码安装之后的成功提示中,如下所示:

6ae08a65cd99

php-config.png

6.5运行测试文件

php -q aatest.php

运行结果:

Functions available in the test extension:

confirm_aatest_compiled

hello aatest!

----------------------------------------------------------------------

此时,代表扩展是正确的。

6.6添加php.ini 和扩展

虽然上面的步骤证明了扩展是正确的,但是通过命令 php -m 发现此时扩展中还没有刚才创建的扩展,但是查看步骤6.4的存放扩展的文件夹中,已经将扩展文件加进去了。于是猜想可能还需要在配置文件中,添加扩展的路径,但是。。。php --ini查看,居然连 php.ini 文件都没有!!!

root@544e81fb3734:/# php -m

[PHP Modules]

Core

ctype

date

dom

......

[Zend Modules]

root@544e81fb3734:/# php -i | grep aatest

root@544e81fb3734:/# ls /usr/local/lib/php/extensions/no-debug-non-zts-20160303/

aatest.so opcache.a opcache.so

root@544e81fb3734:/# php --ini

Configuration File (php.ini) Path: /usr/local/lib

Loaded Configuration File: (none)

Scan for additional .ini files in: (none)

Additional .ini files parsed: (none)

查询得知,源码编译完了之后就是没有 php.ini文件,需要手动添加

1.首先确定 php.ini文件的存放路径

2.拷贝源码中的文件,并重命名为 php.ini

3.添加 extension=aatest.so,拷贝 至 步骤1的目录中

root@544e81fb3734:/# php -i | grep "php.ini"

Configuration File (php.ini) Path => /usr/local/lib

root@544e81fb3734:/# cd root/php-src/

root@544e81fb3734:~/php-src# ls

CODING_STANDARDS Makefile.objects README.SUBMITTING_PATCH Zend config.sub libtool php.ini-development stub.c

CONTRIBUTING.md NEWS README.TESTING acinclude.m4 configure ltmain.sh php.ini-production tests

......

root@544e81fb3734:~/php-src# cp php.ini-development php.ini

----------------------------------------------------------------------

//php.ini文件中

......

;extension=php_pdo_sqlite.dll

;extension=php_pgsql.dll

;extension=php_shmop.dll

//添加下面这行进行 aatest 扩展的添加

extension=aatest.so

; The MIBS data available

......

----------------------------------------------------------------------

root@544e81fb3734:~/php-src# cp php.ini /usr/local/lib/php.ini

root@544e81fb3734:~/php-src# ls /usr/local/lib/

php php.ini python3.6

root@544e81fb3734:~/php-src# php -i | grep "php.ini"

Configuration File (php.ini) Path => /usr/local/lib

Loaded Configuration File => /usr/local/lib/php.ini

root@544e81fb3734:~/php-src# php -m

[PHP Modules]

aatest

Core

ctype

.......

//上面两条命令查看,aatest 扩展已经有了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值