PHP 有丰富的函数库,一般情况下已经足够我们使用。为什么还要开发 PHP 扩展呢?主要有以下几个原因:
目录 | 描述 |
---|---|
ext | 这是存放动态和内建模块的目录,在这里可以找到所有PHP官方扩展,并且以后也会在这里编写扩展 |
main | 包含PHP主要宏定义 |
pear | 该目录就是“PHP扩展与应用库”目录,包含PEAR核心文件 |
sapi | 包含不同服务器抽象层的代码 |
TSRM | Zend和PHP的“线程安全资源管理器”目录 |
Zend | 包含Zend引擎的所有文件。在这里你可以找到所有Zzend API定义个宏等 |
除了以上源码目录之外,还需要了解以下几个重要的头文件,因为在编写扩展的过程中,一般要把这些文件包含进来:
PHP 内核开发人员为编写 PHP 扩展提供一个很好用的 自动构建系统 工具 ext_skel。使用 ext_skel 可以很方便地搭建一个扩展框架。
ext_skel 工具在 PHP 源码目录下的 ext 目录下。ext 目录下有两个文件,ext_skel 和 ext_skel_win32.php,第一个在 linux 系统下使用,而 ext_skel_win32.php 则是在 Windows 系统下使用的。
在 Windows 平台配置编写PHP扩展的环境比较简单,只需要安装VC++就行了,版本建议使用6.0,因为vc++6.0速度比较快,而且比较轻巧。另外建议安装"Visual Assist X",这样会使编写PHP扩展变得非常容易。 除了安装VC++之外,还需要一样非常重要的东西,那就是PHP源代码。
1、使用 ext_skel 工具
使用 ext_skel工具创建出一个PHP扩展的框架,首先在命令行下进入到PHP源代码目录的ext目录下,输入以下命令创建扩展框架
- php ext_skel_win32.php --extname = myext
-
成功之后会发现 ext 目录下多了一个 myext 目录,目录中myext.dsp是VC++的工程文件
2、编译安装扩展
用vc++打开myext.dsp工程文件,按编译按钮开始编译这个扩展。在编译的过程中,会发现编译出错了,错误提示找不到php5ts.lib文件。从PHP的安装目录(注意不是源代码目录)下的dev目录中,把php5ts.lib文件复制到创建的扩展目录(myext)下,然后再次按编译按钮,这次成功安装扩展
编译扩展之后,源代码的根目录下多了一个Release_TS目录,在该目录中有刚刚编译好的动态扩展文件php_myext.dll
注意:如果在源代码根目录下找不到Release_TS目录,而找到Debug_TS目录的话,请把VC++的编译模式改为Release。
至此,已经在Windows环境上创建一个PHP扩展,现在把这个扩展安装到PHP中。
安装也很简单,只要把编译好的dll文件复制到php安装目录下的ext目录下,然后在php.ini配置文件中添加"extension=php_myext.dll",并重启Web服务器就可以。
可以调用 confirm_myext_compiled() 函数测试我们的扩展
- <?php
- confirm_myext_compiled("hello myext");
-
1、安装 php-dev 包
使用php-dev包中的phpize工具可以减少很多繁琐的步骤。如果使用PHP源码编译的话,就不用安装php-dev包,因为PHP源码中已经有phpize工具
2、使用 ext_skel 工具
- ./ext_skel --extname = myext
-
生成框架后,需要修改扩展 m4 文件。打开 config.m4 文件,去掉以下配置前的 dnl:
- dnl PHP_ARG_ENABLE(hello,whether to enable hello support,
- dnl [--enable-hello Enable hello support]
-
- 修改为:
-
- PHP_ARG_ENABLE(hello,whether to enable hello support,
- [--enable-hello Enable hello support]
-
- vim php_extname.h文件
-
- 搜索:extern zend_module_entry 新增一行:
- PHP_FUNCTION(yaok_test);//yaok_test就是新增的函数定义
-
- vi extname.c
- 搜索:const zend_function_entry extname_functions[] 新增一行:
- PHP_FE(yaok_test, NULL)//yaok_test就是新增的函数定义
-
- 在 extname.c 底部新增一个方法
- PHP_FUNCTION(yaok_test)
- {
- char *arg = NULL;
- int arg_len, len;
- char *strg;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
- return;
- }
- len = spprintf(&strg, 0, "Hello World: %s", arg);
- RETURN_STRINGL(strg, len, 0);
- }
-
3、编译安装扩展
创建好扩展框架后,进入到扩展的目录下,使用phpize命令生成扩展的配置工具,然后编译和安装
- cd myext
- phpsize
- ./configure --with-php-config=/usr/local/php5/bin/php-config
- make && make install
-
编译安装后,可以在 /usr/localphp5/lib/extension/no-debug-non-zts-20060613/ 目录下看到生成的扩展文件 myext.so,接着在 php.ini 文件中添加扩展信息: extension=myext.so 最后使用 php -m 命令查看扩展是否安装成功。
1、Yaf 一个 PHP 扩展实现的 PHP 框架
2、Plua 进入 Pecl,支持在 PHP 中调用 Lua 脚本
3、随着 PHP 7.4 而来的有一个我认为非常有用的一个扩展:PHP FFI(Foreign Function interface)FFI 提供了高级语言直接的互相调用,而对于 PHP 来说,FFI 让我们可以方便的调用 C 语言写的各种库。