本文介绍如何制作一个php扩展

  • 下载PHP源码

    本文采用 php 7.4.27,基于 Ubuntu 18.04.4 LTS
    点击下载源码

  • 编译安装 PHP

    按顺序执行下列命令

    # 更新你的系统
    apt update
    # autoconf 是一种用于生成shell脚本的工具,可自动配置软件源代码包,以适应多种类型的 Posix-like 系统
    autoconf
    # autoheader 命令可以为使用configure创建C定义的模板文件
    autoheader
    # 配置
    ./configure --prefix=/usr/local/php7.4.27 --with-config-file-path=/etc --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-curl --enable-fpm
    # 4线程构建
    make -j4
    # 安装
    make install

    中间可能会构建失败,你需要逐一安装 php 依赖的扩展:

    # 你可能需要一个个安装
    apt-get install libxml2 libxml2-dev sqlite3 libsqlite3-dev libcurl4-openssl-dev libxml-dev

    至此,php 安装完毕,可以查看下 php 版本:

    /usr/local/php7.4.27/bin/php -v
    # 输出
    PHP 7.4.27 (cli) (built: Jun 21 2022 19:15:41) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0, Copyright (c) Zend Technologies

    开始制作扩展

    # 进入扩展目录
    cd /soft/php/php-src/php-src-php-7.4.27/ext/
    # 生成一个扩展框架,pdo_encrypt 是你的扩展名称
    /usr/local/php7.4.27/bin/php ./ext_skel.php --ext pdo_encrypt
    # 进入框架目录
    cd pdo_encrypt/
    ⏬
    ⏬
    • 编辑 pdo_encrypt.c 文件

      vi pdo_encrypt.c
    • 添加一个 PHP 方法

      # 找到 PHP_RINIT_FUNCTION(pdo_encrypt) 行,在该行上面添加下面代码
      PHP_FUNCTION(pdo_encode)
      {
            char *passwd;
            size_t passwd_len;
            zend_string *retval;
      
            ZEND_PARSE_PARAMETERS_START(0, 1)
                    Z_PARAM_OPTIONAL
                    Z_PARAM_STRING(passwd, passwd_len)
            ZEND_PARSE_PARAMETERS_END();
      
            // 这一行是密码加密逻辑,调用了一个 c 函数,你可以忽略,先尝试把扩展运行起来
            // passwd = encode(passwd);
            retval = strpprintf(0, "%s", passwd);
            RETURN_STR(retval);
      }
    • 添加参数接收规则

      # 找到这一行
      static const zend_function_entry pdo_encrypt_functions
      # 在这一行上面,添加下面代码
      ZEND_BEGIN_ARG_INFO(arginfo_pdo_encode, 0)
            ZEND_ARG_INFO(0, passwd)
      ZEND_END_ARG_INFO()
      # 在这一行方法体里,添加下面代码
      PHP_FE(pdo_encode,              arginfo_pdo_encode)
    • 至此 c 文件修改完毕,保存退出。

    • 开始编译扩展

      # phpize 是一个运行脚本,主要作用是检测 php 的环境还有就是在特定的目录生成相应的 configure 文件,这样 make install之后,生成的 .so 文件才会自动加载到 php 扩展目录下面
      /usr/local/php7.4.27/bin/phpize
      # 配置扩展
      ./configure --enable-pdo_encrypt --with-php-config=/usr/local/php7.4.27/bin/php-config
      # 构建扩展
      make -j4
    • 至此扩展编译完成

      # 上面步骤完成后,当前 pdo_encrypt/ 目录下,将生成一个 modules/ 目录,进入此目录,你会发现多了两个文件
      -rw-r--r-- 1 root root   844 6月  23 10:33 pdo_encrypt.la
      -rwxr-xr-x 1 root root 61584 6月  23 10:33 pdo_encrypt.so*
      # 你可以将 pdo_encrypt.so 文件配置到你的 php 中了,这一步不再赘述。
    • 扩展安装成功的证据:

    • php 代码调用

    • 体验一下效果
      传送门

作者:Wolf  创建时间:2022-11-19 11:43
最后编辑:Wolf  更新时间:2023-11-27 23:47