关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » PHP »如何编写一个独立的 PHP 扩展

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

    2016-01-05 00:00:00 出处:ITJS
    分享

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

    配置文件 (config.m4) 你的模块源码

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

    准备好系统工具

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

    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/WITH 为 PHP_NEW_EXTENSION 设定的。

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

    注:PHP_ARG_ENABLE 和 PHP_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 模块添加共享支持。

    在 config.m4 文件中,使用 PHP_ARG_WITH/PHP_ARG_ENABLE 来设定扩展,这样就可以自动使用 --with-foo=shared[,..] 或 --enable-foo=shared[,..] 这样的指令作为编译参数了。 在 config.m4 文件中,使用 PHP_NEW_EXTENSION(foo,.., $ext_shared) 使扩展可以被构建。 添加以下代码到你的 C 语言资源文件中:
       #ifdef COMPILE_DL_FOO
       ZEND_GET_MODULE(foo)
       #endif

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

    PECL 网站约定

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

    添加 LICENSE 或 COPYING 到 package.xml 需要在扩展头文件中定义好版本信息,这个宏会被 foo_module_entry 调用来声明扩展版本:
       #define PHP_FOO_VERSION "1.2.3"
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。