来自 新葡8455Web前端 2020-02-27 02:07 的文章
当前位置: 新葡棋牌京官网app > 新葡8455Web前端 > 正文

如何编写一个独立的 PHP 扩展

准备好系统工具

想要扩展能够在系统上编译并成功运行,需要准备转以下工具:

  • GNU autoconf
  • GNU automake
  • GNU libtool
  • GNU m4

以上这些都可以从 获取。

注:以上这些都是类 Unix 环境下才能使用的工具。

如何编写一个独立的 PHP 扩展。三、phpize、配置、编译

因为我的Mac上已经自带了PHP的环境,就不采取全套PHP源码编译的方法了。使用命令行工具phpize对扩展进行编译。

phpize 命令是用来准备 PHP 扩展库的编译环境的工具。如果系统中没有 phpize 命令并且使用了预编译的包(例如 RPM),那要安装 PHP 包相应的开发版本,此版本通常包含了 phpize 命令以及相应的用于编译 PHP 及其扩展库的头文件。使用 phpize --help 命令可以显示此命令用法。

使用root权限执行phpize:

 zhangxuefeng@zhangxuefengdeMac-mini  ~/Developer/php-5.6.24/ext/edutest1  sudo /usr/bin/phpize
Password:
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212

configure,需要使用php-config工具:

php-config 是一个简单的命令行脚本用于获取所安装的 PHP 配置的信息。在编译扩展时,如果安装有多个 PHP 版本,可以在配置时用 --with-php-config 选项来指定使用哪一个版本编译,该选项指定了相对应的 php-config 脚本的路径。

 ✘ zhangxuefeng@zhangxuefengdeMac-mini  ~/Developer/php-5.6.24/ext/edutest1  sudo ./configure --enable-edutest1 --with-php-config=/usr/bin/php-config
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
checking for cc... cc
……

Make 编译:

 zhangxuefeng@zhangxuefengdeMac-mini  ~/Developer/php-5.6.24/ext/edutest1  sudo make
Password:
/bin/sh /Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1/libtool --mode=compile cc  -I. -I/Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1 -DPHP_ATOM_INC -I/Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1/include -I/Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1/main -I/Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib  -DHAVE_CONFIG_H  -g -O2   -c /Users/zhangxuefeng/Developer/php-5.6.24/ext/edutest1/edutest1.c -o edutest1.lo
mkdir .libs
……
……
……
Build complete.
Don't forget to run 'make test'.

Make Install:

 zhangxuefeng@zhangxuefengdeMac-mini  ~/Developer/php-5.6.24/ext/edutest1  sudo make install
Installing shared extensions:     /usr/lib/php/extensions/no-debug-non-zts-20121212/

添加完整路径到php.ini中:

 zhangxuefeng@zhangxuefengdeMac-mini sudo vim /etc/php.ini
……
899 extension=/usr/lib/php/extensions/no-debug-non-zts-20121212/edutest1.so
……
  • 配置文件 (config.m4)
  • 你的模块源码
宏PHP_ARG_ENABLE,含有三个参数:

第一个参数,extest1./configure建立了名为enable-edutest1的选项
第二个参数将会在./configure命令处理到该扩展的配置文件时,显示该参数的内容
第三个参数是./configure命令的帮助,在使用./configure --help的时候显示

改装一个已经存在的扩展

为了显示出创建一个独立的扩展是很容易的事情,我们先将一个已经内嵌到 PHP 的扩展改成独立扩展。安装 PHP 并且执行以下命令:

$ mkdir /tmp/newext
$ cd /tmp/newext

现在你已经有了一个空目录。我们将 mysql 扩展目录下的文件复制过来:

$ cp -rp php-4.0.X/ext/mysql/* .
# 注:看来这篇 README 真的需要更新一下了
# PHP7 中已经移除了 mysql 扩展部分

到这里扩展就完成了,执行:

$ phpize

现在你可以独立存放这个目录下的文件到任何地方,这个扩展可以完全独立存在了。

用户在编译时需要使用以下命令:

$ ./configure 
       [--with-php-config=/path/to/php-config] 
       [--with-mysql=MYSQL-DIR]
$ make install

这样 MySQL 模块就可以使用内嵌的 MySQL 客户端库或者已安装的位于 MySQL 目录中的 MySQL。

注:意思是说想要编写 PHP 扩展,你既需要已经安装了 PHP,也需要下载一份 PHP 源码。

成功!

独立的 PHP 扩展可以独立于 PHP 源码之外进行分发。要创建一个这样的扩展,需要准备好两样东西:

根据需要修改config.m4

  1. 切换到ext/edutest1/目录。
  2. vi config.m4
  3. 将下面的第一、三行取消注释,并删掉第二行:
16 dnl PHP_ARG_ENABLE(edutest1, whether to enable edutest1 support,
 17 dnl Make sure that the comment is aligned:
 18 dnl [  --enable-edutest1           Enable edutest1 support])

修改为:

16 PHP_ARG_ENABLE(edutest1, whether to enable edutest1 support,
 17     [  --enable-edutest1           Enable edutest1 support])
  1. PHP_SUBST一行的注释打开:
19 if test "$PHP_EDUTEST1" != "no"; then
……
59   PHP_SUBST(EDUTEST1_SHARED_LIBADD)
60
61   PHP_NEW_EXTENSION(edutest1, edutest1.c, $ext_shared)
62 fi

简要说明:

修改 m4 后缀的配置文件

m4 配置文件可以指定一些额外的检查。对于一个独立扩展来说,你只需要做一些宏调用即可。

PHP_ARG_ENABLE(foobar,whether to enable foobar,
[  --enable-foobar            Enable foobar])

if test "$PHP_FOOBAR" != "no"; then
  PHP_NEW_EXTENSION(foobar, foo.c bar.c, $ext_shared)
fi

PHP_ARG_ENABLE 会自动设置好正确的变量以保证扩展能够被 PHP_NEW_EXTENSION 以共享模式启动。

PHP_NEW_EXTENSION 的第一个参数是扩展的名称,第二个参数是资源文件。第三个参数 $ext_shared 是由 PHP_ARG_ENABLE/WITHPHP_NEW_EXTENSION 设定的。

请始终使用 PHP_ARG_ENABLEPHP_ARG_WITH 进行设置。即使你不打算发布你的 PHP 模块,这些设置也可以保证让你的模块和 PHP 主模块的接口保持一体。

注:PHP_ARG_ENABLEPHP_ARG_WITH 应该是用于定义模块是动态扩展还是静态编译进 PHP 中,就跟编译 PHP 时使用的 --enable-xxx--with-xxx 一样。

执行创建edutest1

 ✘ zhangxuefeng@zhangxuefengdeMac-mini  ~/Developer/php-5.6.24/ext  ./ext_skel --extname=edutest1
Creating directory edutest1
Creating basic files: config.m4 config.w32 .gitignore edutest1.c php_edutest1.h CREDITS EXPERIMENTAL tests/001.phpt edutest1.php [done].

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

1.  $ cd ..
2.  $ vi ext/edutest1/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-edutest1
5.  $ make
6.  $ ./sapi/cli/php -f ext/edutest1/edutest1.php
7.  $ vi ext/edutest1/edutest1.c
8.  $ make

Repeat steps 3-6 until you are satisfied with ext/edutest1/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.

PECL 网站约定

如果你打算发布你的扩展到 PECL 的网站,需要考虑以下几点:

  1. 添加 LICENSE 或 COPYING 到 package.xml
  2. 需要在扩展头文件中定义好版本信息,这个宏会被 foo_module_entry 调用来声明扩展版本:
   #define PHP_FOO_VERSION "1.2.3"
宏PHP_NEW_EXTENSION

该宏声明了扩展的模块和必须要编译作为扩展一部分的源码文件。如果需要多个源文件,则使用空格分隔,第三个参数$ext_shared与调用PHP_SUBST(EDUTEST1_SHARED_LIBADD)有关。

本文由新葡棋牌京官网app发布于新葡8455Web前端,转载请注明出处:如何编写一个独立的 PHP 扩展

关键词: