PHP 扩展开发

发布于 2021-07-23 08:55:26 字数 4303 浏览 1531 评论 0

一、为什么要开发 PHP 扩展

PHP 有丰富的函数库,一般情况下已经足够我们使用。为什么还要开发 PHP 扩展呢?主要有以下几个原因:

  • 如果应用是非常注重效率的,如复杂的图像算法,需要编写成PHP扩展。
  • 有些系统调用不能用PHP直接访问,需要编写成扩展,例如使用Linux下的fork()函数创建一个进程。
  • 如果想商业化一个应用,但是又不想暴露源代码,可以编写成扩展(当然还可以使用Zend公司的加密工具Zend Guard)

二、搭建 PHP 扩展框架

2.1、PHP 源代码目录

目录描述
ext这是存放动态和内建模块的目录,在这里可以找到所有PHP官方扩展,并且以后也会在这里编写扩展
main包含PHP主要宏定义
pear该目录就是“PHP扩展与应用库”目录,包含PEAR核心文件
sapi包含不同服务器抽象层的代码
TSRMZend和PHP的“线程安全资源管理器”目录
Zend包含Zend引擎的所有文件。在这里你可以找到所有Zzend API定义个宏等

除了以上源码目录之外,还需要了解以下几个重要的头文件,因为在编写扩展的过程中,一般要把这些文件包含进来:

  • main/php.h:位于main目录下。包含绝大部分PHP宏及PHP API定义
  • Zend/zend.h:位于Zend目录下。包含绝大部分Zend宏及Zend API定义
  • Zend/zend_API.h:位于Zend目录下。包含Zend API定义

2.2ext_skel 工具

PHP 内核开发人员为编写 PHP 扩展提供一个很好用的 自动构建系统 工具 ext_skel。使用 ext_skel 可以很方便地搭建一个扩展框架。

ext_skel 工具在 PHP 源码目录下的 ext 目录下。ext 目录下有两个文件,ext_skel 和 ext_skel_win32.php,第一个在 linux 系统下使用,而 ext_skel_win32.php 则是在 Windows 系统下使用的。

2.3Windows 平台环境配置

在 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");

2.4 Linux 平台环境配置

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 语言写的各种库。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

胡图图

文章 0 评论 0

zt006

文章 0 评论 0

z祗昰~

文章 0 评论 0

冰葑

文章 0 评论 0

野の

文章 0 评论 0

天空

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文