我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

本篇文章给大家分享的是有关如何编写一个独立的PHP扩展,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

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

  • 配置文件 (config.m4)

  • 你的模块源码

接下来我们来描述一下如果创建这些文件并组合起来。

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

准备好系统工具

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

  • GNU autoconf

  • GNU automake

  • GNU libtool

  • GNU m4

以上这些都可以从 ftp://ftp.gnu.org/pub/gnu/ 获取。

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

改装一个已经存在的扩展

为了显示出创建一个独立的扩展是很容易的事情,我们先将一个已经内嵌到 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 源码。

定义一个新扩展

我们给示例扩展命名为 “foobar”。

新扩展包含两个资源文件:foo.c 和 bar.c(还有一些头文件,但这些不只重要)。

示例扩展不引用任何外部的库(这点很重要,因为这样用户就不需要特别指定一些编译选项了)。

LTLIBRARY_SOURCES 选项用于指定资源文件的名字,你可以有任意数量的资源文件。

注:上面说的是 Makefile.in 文件中的配置选项,可以参考 xdebug。

修改 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 一样。

创建资源文件

ext_skel 可以为你的 PHP 模块创建一些通用的代码,你也可以编写一些基本函数定义和 C 代码来处理函数的参数。具体信息可以查看 READNE.EXT_SKEL。

不要担心没有范例,PHP 中有很多模块供你参考,选择一个简单的点开始,添加你自己的代码。

注:ext_skel 可以生成好基本模块需要的资源文件和配置文件,不需要自己创建。

修改自定义模块

将 config.m4 文件和资源文件放到同一个目录中,然后执行 phpize (PHP 4.0 以上的版本编译 PHP 的时候都安装了 phpize)。

如果你的 phpize 不在系统环境变量中,你需要指定绝对路径,例如:

$ /php/bin/phpize

这个命令会自动复制必需的构建文件到当前目录并根据 config.m4 创建配置文件。

通过以上的步骤,你已经有了一个独立的扩展了。

安装扩展

扩展可以通过以下命令编译安装:

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

给模块添加共享支持

有时候独立扩展需要是共享的已供其他模块加载。接下来我会解释如何给已经创建好的 foo 模块添加共享支持。

  1. 在 config.m4 文件中,使用 PHP_ARG_WITH/PHP_ARG_ENABLE 来设定扩展,这样就可以自动使用 --with-foo=shared[,..]--enable-foo=shared[,..] 这样的指令作为编译参数了。

  2. 在 config.m4 文件中,使用 PHP_NEW_EXTENSION(foo,.., $ext_shared) 使扩展可以被构建。

  3. 添加以下代码到你的 C 语言资源文件中:

#ifdef COMPILE_DL_FOO
   ZEND_GET_MODULE(foo)
   #endif

这一段讲的上面都提到过了,这里只是又强调了一下。

PECL 网站约定

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

  1. 添加 LICENSE 或 COPYING 到 package.xml

  2. 需要在扩展头文件中定义好版本信息,这个宏会被 foo_module_entry 调用来声明扩展版本:

#define PHP_FOO_VERSION "1.2.3"


 

以上就是如何编写一个独立的PHP扩展,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

本篇文章给大家分享的是有关如何编写一个独立的PHP扩展,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。独立的 PHP 扩展可以独立于 PHP 源码之外进行分发。要创建一个这样的扩
2023-06-17

golang如何编写PHP扩展

这篇文章主要为大家展示了golang如何编写PHP扩展,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“golang如何编写PHP扩展”这篇文章吧。golang适合做什么golang可以做服务器端开发
2023-06-06

Linux下如何独立添加PHP扩展模块mbstring

小编给大家分享一下Linux下如何独立添加PHP扩展模块mbstring,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!环境php5.2.13, 不支持mbstring扩展假如php的源码包在/usr/local/src/p
2023-06-07

如何使用Cython为Python编写更快的C扩展

本篇文章为大家展示了如何使用Cython为Python编写更快的C扩展,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在我们这个包含了 7 个 PyPI 库的系列文章中学习解决常见的 Python 问
2023-06-16

PHP扩展开发:如何编写跨平台兼容的自定义函数?

为了编写跨平台兼容的php自定义函数,需要遵循以下步骤:使用php本机类型,避免平台特定类型。使用realpath()获取文件绝对路径。根据平台差异调整函数行为。使用可移植预编译指令。PHP扩展开发:编写跨平台兼容的自定义函数编写跨平台兼
PHP扩展开发:如何编写跨平台兼容的自定义函数?
2024-05-15

PHP 函数的可重用性:如何编写易于维护和扩展的代码

php 函数的可重用性:通过封装通用功能,可重用函数减少了重复并提高了代码清晰度。为了编写可重用的函数,请:定义函数的参数和返回值。使用命名空间来组织函数。使用类和特性来分组函数。PHP 函数的可重用性:编写易于维护和扩展的代码可重用函数
PHP 函数的可重用性:如何编写易于维护和扩展的代码
2024-04-12

如何解决php编译后没有扩展库的问题

本篇内容主要讲解“如何解决php编译后没有扩展库的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决php编译后没有扩展库的问题”吧!php编译后没有扩展库的解决方法是,首先进入php的
2023-06-20

如何编写一个VBScript简单的页面

这篇文章主要介绍“如何编写一个VBScript简单的页面”,在日常操作中,相信很多人在如何编写一个VBScript简单的页面问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何编写一个VBScript简单的页面
2023-06-09

如何从另一个数组的扩展创建内联数组

php小编柚子今天为大家介绍一种在PHP中创建内联数组的方法,即通过扩展另一个数组来快速构建。这种方法可以让我们更高效地创建和组织数组,提高代码的可读性和可维护性。本文将详细解释如何使用这种方法,并提供一些实际应用的示例,帮助读者更好地理解
如何从另一个数组的扩展创建内联数组
2024-02-10

如何通过PHP编写一个简单的在线问诊系统

随着互联网技术的不断发展,越来越多的医疗服务开始向线上转移。在线问诊系统作为其中的一种形式,给予了患者和医生一个更加便捷和高效的交流方式。本文将介绍如何通过PHP编写一个简单的在线问诊系统,并提供具体的代码示例。开发环境准备在开始开发之前,
2023-10-21

如何使用vbs实现一个扩展时间段的dir命令

这篇文章主要介绍了如何使用vbs实现一个扩展时间段的dir命令,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。核心代码set Arg=Wscript.Arguments If
2023-06-08

如何学识Rust编写一个简单的游戏

这篇文章主要讲解了“ 如何学识Rust编写一个简单的游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ 如何学识Rust编写一个简单的游戏”吧!安装 Rust你可以使用 Rustup 安装一
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录