千家信息网

怎样在PHP运行时添加自定义扩展?

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,准备工作依赖工具本项目是在 MacOS 下开发的,涉及到的工具是平台无关的,对于 Linux 和 Windows 桌面系统应该也同样适用。在开始本例之前请确保如下工具已经正确的安装,更新到最新版本,并
千家信息网最后更新 2026年10月31日怎样在PHP运行时添加自定义扩展?

准备工作

依赖工具

本项目是在 MacOS 下开发的,涉及到的工具是平台无关的,对于 Linux 和 Windows 桌面系统应该也同样适用。在开始本例之前请确保如下工具已经正确的安装,更新到最新版本,并进行正确的配置。

  • Docker
  • Fun

Fun 和 Fcli 工具依赖于 docker 来模拟本地环境。
对于 MacOS 用户可以使用 homebrew 进行安装:

brew cask install dockerbrew tap vangie/formulabrew install funbrew install fcli

Windows 和 Linux 用户安装请参考:

  1. https://github.com/aliyun/fun/blob/master/docs/usage/installation.md
  2. https://github.com/aliyun/fcli/releases

安装好后,记得先执行 fun config 初始化一下配置。

注意, 如果你已经安装过了 fun,确保 fun 的版本在 3.6.1 以上。

$ fun --version3.6.1

PHP 自定义扩展

在函数代码目录创建一个名为 extension 的目录,并且将扩展对应的 .ini 和 .so 文件放在 extension 目录下。例如,以下为一个 hello 的自定义扩展,假设该扩展里有一份 hello_world 函数:

.|____extension| |____hello.ini| |____hello.so|____main.php

hello.ini

extension=/code/extension/hello.so

main.php

 

上述方法是函数计算PHP 运行时提供的扩展方法。实践过程中会碰到如下两个问题:

  1. .so 文件应该如何构建出来,或者去哪里下载
  2. 有了 .so 文件后,本地如何调试代码

完整示例

下面会基于借用 [PHP 访问 MongoDB 的例子]()来介绍如何借助于 Funcraft 进行 PHP 开发,因为 composer 依赖 mongodb/mongodb 需要安装 extension。

初始化项目

# 创建工程目录并进入$ mkdir fc-mongodb && cd fc-mongodb# 初始化$ fun init event-php7.2

通过 Funfile 安装

我们在 Linux 平台下通常会通过 pecl 工具进行 PHP 的扩展安装。比如 pecl install mongodb。该命令会触发源代码下载、编译并拷贝到系统 PHP 目录。pecl 需要执行在 Linux 环境中才能装linux 版本的 .so 文件。在函数计算这里可以通过 fun install 机制进行安装。

新建一个 Funfile 文件,内容如下:

RUNTIME php7.2RUN apt-get update && apt-get install -y libcurl4-openssl-dev pkg-config libssl-devRUN pecl install mongodbRUN mkdir -p /code/extension && mv /usr/local/lib/php/extensions/*/mongodb.so /code/extensionRUN echo "extension=/code/extension/mongodb.so" > /code/extension/mongodb.ini

逐行解释一下上面五行指令

  1. 第一行先声明是一个 php7.2 版本的 Runtime,
  2. 接着安装 构建 mongodb 所需要的依赖,这里主要是为了装 openssl,为了能让 mongodb 扩展库支持 ssl,以解决连接时的一个报错。所有
  3. 通过 pecl 下载、构建并且安装 mongodb 扩展
  4. 将 mongodb 扩展拷贝到 /code/extendsion 目录,该目录是函数计算约定的 extension 目录
  5. 生成 mongodb.int 文件,这里文件名是随意的,只需要 .ini 结尾就好了。

然后执行

fun install -f phpusing template: template.yml...Install Success

安装以后会多处一个 extension 目录,包含 mongodb.so 和 mongodb.ini 文件

╰─➜  tree.├── Funfile├── extension│   ├── mongodb.ini│   └── mongodb.so├── index.php└── template.yml

安装 mongodb 依赖

执行下面命令通过 composer 安装依赖 'mongodb/mongodb'

$ fun install sbox -f fc-mongodb -c "composer require mongodb/mongodb"using template: template.ymlskip pulling image aliyunfc/runtime-php7.2:build-1.9.0...Using version ^1.6 for mongodb/mongodb./composer.json has been createdLoading composer repositories with package informationUpdating dependencies (including require-dev)Package operations: 1 install, 0 updates, 0 removals  - Installing mongodb/mongodb (1.6.0): Downloading (100%)         Writing lock fileGenerating autoload files

安装成功后会在代码目录多处 composer.json 文件、composer.lock 文件和 vendor 目录

╰─➜  tree -L 2.├── Funfile├── composer.json├── composer.lock├── extension│   ├── mongodb.ini│   └── mongodb.so├── index.php├── template.yml└── vendor    ├── autoload.php    ├── composer    └── mongodb

本地调试

更新 index.php 文件

$db_name->fc_col;    $result = $collection->insertOne(['DEMO' => 'FC', 'MSG' => 'Hello FunctionCompute For MongoDB']);    echo "Inserted with Object ID '{$result->getInsertedId()}'", "\n";    $cursor = $collection->find(['DEMO' => 'FC']);    $result = '';    foreach ($cursor as $entry) {        echo json_encode($entry->getArrayCopy()), "\n";        $result = $result . json_encode($entry->getArrayCopy()) . "\n";    }    return $result;}

借助 docker 启动一个临时的 mongodb 数据库

docker run --rm --name mongo_for_fc \    -e MONGO_INITDB_ROOT_USERNAME=mongoadmin \    -e MONGO_INITDB_ROOT_PASSWORD=secret \    -p 27017:27017 \    mongo

更新 template.yml 文件,添加 MONGO_DATABASE 和 MONGO_URL 环境变量。

ROSTemplateFormatVersion: '2015-09-01'Transform: 'Aliyun::Serverless-2018-04-03'Resources:  fc-mongodb:    Type: 'Aliyun::Serverless::Service'    Properties:      Description: 'helloworld'    fc-mongodb:      Type: 'Aliyun::Serverless::Function'      Properties:        Handler: index.handler        Runtime: php7.2        CodeUri: './'        EnvironmentVariables:          MONGO_DATABASE: admin          MONGO_URL: mongodb://mongoadmin:secret@host.docker.internal:27017/admin

使用 fun local 本地模拟运行

$ fun local invokeusing template: template.ymlMissing invokeName argument, Fun will use the first function fc-mongodb/fc-mongodb as invokeNameskip pulling image aliyunfc/runtime-php7.2:1.9.2...FunctionCompute php7.2 runtime inited.FC Invoke Start RequestId: b1764771-896b-4c27-9ad8-6c325cc3d749Inserted with Object ID '5e539d08c42dc23cf23863e2'{"_id":{"$oid":"5e539d08c42dc23cf23863e2"},"DEMO":"FC","MSG":"Hello FunctionCompute For MongoDB"}FC Invoke End RequestId: b1764771-896b-4c27-9ad8-6c325cc3d749{"_id":{"$oid":"5e539d08c42dc23cf23863e2"},"DEMO":"FC","MSG":"Hello FunctionCompute For MongoDB"}RequestId: b1764771-896b-4c27-9ad8-6c325cc3d749          Billed Duration: 214 ms         Memory Size: 1989 MB    Max Memory Used: 27 MB

如果希望本地断点调试可以使用 Aliyun Serverless VSCode Extension,如下图

发布并调用

请将 template.yml 配置文件中的 MONGO_DATABASE 和 MONGO_URL 环境变量更新为您线上系统的相应配置,然后发布

$ fun deployusing template: template.ymlusing region: cn-shanghaiusing accountId: ***********4733using accessKeyId: ***********EUz3using timeout: 60Collecting your services information, in order to caculate devlopment changes...Resources Changes(Beta version! Only FC resources changes will be displayed):┌────────────┬──────────────────────────────┬────────┬──────────────────────┐│ Resource   │ ResourceType                 │ Action │ Property             │├────────────┼──────────────────────────────┼────────┼──────────────────────┤│ fc-mongodb │ Aliyun::Serverless::Service  │ Modify │ Description          │├────────────┼──────────────────────────────┼────────┼──────────────────────┤│            │                              │        │ Handler              ││            │                              │        ├──────────────────────┤│            │                              │        │ Runtime              ││ fc-mongodb │ Aliyun::Serverless::Function │ Modify ├──────────────────────┤│            │                              │        │ CodeUri              ││            │                              │        ├──────────────────────┤│            │                              │        │ EnvironmentVariables │└────────────┴──────────────────────────────┴────────┴──────────────────────┘? Please confirm to continue. YesWaiting for service fc-mongodb to be deployed...        Waiting for function fc-mongodb to be deployed...                Waiting for packaging function fc-mongodb code...                The function fc-mongodb has been packaged. A total of 761 files files were compressed and the final size was 2.81 MB        function fc-mongodb deploy successservice fc-mongodb deploy success

最使用 fun invoke 命令验证调用结果。

文件 目录 函数 工具 版本 环境 更新 配置 代码 命令 系统 运行 变量 平台 拷贝 方法 用户 项目 开发 成功 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网加科技 广州为想互联网科技有限公司 互联网科技工作委员会副主任毛军 互联网科技公司税收优惠 四个字互联网科技公司取名 无锡溥仪互联网科技有限公司 科技大学互联网专业好不好 互联网科技公司的市场部门 上海电发互联网科技有限公司 云创客互联网科技公司 天速互联网络科技有限公司 互联网教育科技公司vipkid 花神(南京)互联网科技有限公司 宜昌元轩互联网科技有限公司 广州新华互联网科技学校电竞方面 企晟互联网信息科技有限公司 北京市互联网新科技 工业互联网科技成果转化 神州科技互联网有限公司 唐山双旺合互联网科技产业园 南京欣网互联网络科技 深圳九邦互联网科技有限公司 科技制造互联网公司 北京互联网科技 平安科技 互联网 米客互联网科技 万达互联网科技 晓花互联网科技有限公司网址 互联网新科技动漫ppt素材 互联网科技企业文化
0