首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 FrankenPHP 用 Go 编写 PHP 扩展

使用 FrankenPHP 用 Go 编写 PHP 扩展

作者头像
Tinywan
发布2025-09-11 19:27:44
发布2025-09-11 19:27:44
7600
代码可运行
举报
文章被收录于专栏:开源技术小栈开源技术小栈
运行总次数:0
代码可运行

概述

在 PHP 生态系统中,扩展是增强 PHP 功能的重要工具,通常用 C 语言编写以实现高性能和低级访问。然而 C 语言的复杂性以及对 PHP 内核深入理解的需求,使得开发 PHP 扩展对许多开发者来说是一项高门槛任务。

2025 年 PHPVerse 大会上,Kévin 宣布了一项突破性进展:通过 FrankenPHP 开发者现在可以用 Go 语言编写 PHP 扩展。这一创新不仅降低了开发门槛,还引入了 Go 的高性能并发模型,为 PHP 生态带来了全新的可能性。

FrankenPHP 简介

FrankenPHP 是一个现代化的 PHP 应用服务器,基于 Caddy 和 Go 构建集成了 PHP 解释器,支持高性能的 Web 应用部署。它不仅提供了简化的部署方式和性能优化的“工作模式”,还通过 CGO 库实现了 Go 与 PHP 的无缝交互。

FrankenPHP 的独特之处在于,它允许开发者利用 Go 的简单性和高性能特性(如 goroutines)来扩展 PHP 的功能,而无需深入处理复杂的 C 代码。

为什么用 Go 编写 PHP 扩展?

传统上,PHP 扩展主要用 C 编写,但 C 语言的低级特性和 PHP 内部机制的复杂性使得开发过程充满挑战。近年来,Rust 和 C++ 也被用于编写 PHP 扩展,但这些语言同样需要较高的学习成本。

相比之下,Go 语言以其简洁的语法、高效的并发模型(goroutines)和强大的标准库而闻名。FrankenPHP 利用这些优势,提供了以下关键理由:

  1. 1. 高性能并发:Go 的 goroutines 允许在 PHP 中实现高效的并行处理,适合处理耗时或计算密集型任务。
  2. 2. 简化开发:FrankenPHP 的扩展生成器和工具库抽象了底层的 C 代码,让开发者专注于 Go 代码的编写。
  3. 3. 生态整合:通过 Go 扩展,PHP 开发者可以直接使用 Go 生态中的高质量库(如 etcd 缓存系统),扩展 PHP 的功能。
  4. 4. 未来保障:FrankenPHP 现已得到 PHP 基金会的官方支持,其长期发展和社区活跃度得到了保障。

FrankenPHP 的核心工具

FrankenPHP 提供了两种主要方式来帮助开发者用 Go 编写 PHP 扩展:扩展生成器工具库。这两者共同降低了开发 PHP 扩展的技术门槛。

1. 扩展生成器:零 C 代码开发

FrankenPHP 的扩展生成器是一个革命性的工具,允许开发者通过简单的 Go 代码生成完整的 PHP 扩展,而无需手动编写 C 代码。生成器通过特定的 Go 指令(如 // export_php:function)解析 Go 文件,自动生成所需的 C 文件、头文件和其他支持文件。以下是一个简单的例子:

代码语言:javascript
代码运行次数:0
运行
复制
package main

// export_php:function multiply(int $a, int $b): int
func multiply(a int64, b int64) int64 {
    return a * b
}

// export_php:function is_even(int $a): bool
func is_even(a int64) bool {
    return a%2 == 0
}

运行以下命令即可生成扩展:

代码语言:javascript
代码运行次数:0
运行
复制
frankenphp extension-init ext-dir/ext.go

生成器会创建一个 build 目录,包含所有必要的文件,包括:

  • ext.c:自动生成的 C 代码,处理 PHP 和 Go 之间的交互。
  • ext.go:稍作调整的 Go 文件,与 C 代码兼容。
  • ext.hext_arginfo.h:定义函数和参数的头文件。
  • ext.stub.php:PHP 函数签名的存根文件。
  • README.md:导出的扩展元素说明。

通过将生成的 build 目录提供给 Caddy,扩展即可无缝集成到 FrankenPHP 中,无需开发者接触任何 C 代码。

2. 工具库:简化类型转换

在 Go 和 PHP 之间传递复杂数据类型(如字符串、数组或对象)时,需要进行类型转换,这通常涉及复杂的 C 代码。FrankenPHP 提供了一系列工具函数来简化这一过程,例如:

  • frankenphp.GoString():将 C 字符串转换为 Go 字符串。
  • frankenphp.PHPString():将 Go 字符串转换为 PHP 可用的字符串。

以下是一个更复杂的例子,展示了如何定义类、常量和方法:

代码语言:javascript
代码运行次数:0
运行
复制
package main

// export_php:namespace Go\MyExtension
import (
    "C"
    "github.com/dunglas/frankenphp"
    "strings"
    "unsafe"
)

// export_php:const
const MY_GLOBAL_CONSTANT = "Hello, World!"

// export_php:class MySuperClass
type MyClass struct {
    Name string
}

// export_php:method MySuperClass::setName(string $name): void
func (mc *MyClass) SetName(v *C.zend_string) {
    mc.Name = frankenphp.GoString(unsafe.Pointer(v))
}

// export_php:method MySuperClass::getName(): string
func (mc *MyClass) GetName() unsafe.Pointer {
    return frankenphp.PHPString(mc.Name, false)
}

这些工具函数抽象了底层的类型转换逻辑,让开发者可以专注于功能实现,而无需深入了解 PHP 的 Zend 引擎。

3. Caddy 模块集成

FrankenPHP 利用 Caddy 的模块化架构,通过简单的 init() 函数注册 Go 扩展。例如:

代码语言:javascript
代码运行次数:0
运行
复制
package ext

import "C"
import "github.com/dunglas/frankenphp"

func init() {
    frankenphp.RegisterExtension(unsafe.Pointer(&C.ext_module_entry))
}

这一机制将扩展注册到 PHP 解释器中,消除了手动编写 C 代码的需要。

使用场景

使用 Go 编写 PHP 扩展为开发者提供了多种可能性:

  1. 1. 高性能任务:利用 goroutines 执行并行计算,例如图像处理、数据分析或异步 I/O 操作。
  2. 2. Go 库集成:将 Go 生态中的库(如 etcd)封装为 PHP 扩展,扩展 PHP 的功能。
  3. 3. 简化部署:通过 FrankenPHP 的单二进制文件特性,将扩展与应用打包为独立的可执行文件。
  4. 4. 学习与实验:生成器生成的代码为开发者提供了学习 PHP 扩展开发的绝佳机会,可以通过分析生成的 C 代码深入了解底层机制。

如何开始?

  1. 1. 安装 FrankenPHP 根据 FrankenPHP 官方文档安装FrankenPHP 和 Caddy。
  2. 2. 编写 Go 扩展 创建一个 Go 文件,使用 // export_php 指令定义函数、类或常量。
  3. 3. 使用扩展生成器 运行 frankenphp extension-init 命令生成扩展文件。
  4. 4. 集成到 Caddy 将生成的 build 目录提供给 Caddy,启动 FrankenPHP 服务器。
  5. 5. 参考文档 查阅 FrankenPHP 官方文档(https://frankenphp.dev)以获取详细的生成器和工具库使用说明。-e65fz5a14hz7f2wb8xis1zy1bt1t85n168clea19vgm7bxvtgn1bzia./)

注意事项

  • 功能限制:扩展生成器目前支持基础功能(如标量类型、类和方法),但对于高级功能(如复杂的对象操作)可能仍需手动编写 C 代码。
  • 性能权衡:虽然 Go 提供了高性能并发,但与 PHP 的交互可能引入少量开销,需根据应用场景权衡。
  • 社区支持:FrankenPHP 现由 PHP 基金会官方支持,社区活跃,开发者可通过 GitHub Issues 反馈问题。

总结

FrankenPHP 扩展生成器和工具库为 PHP 开发者打开了一扇全新的大门,让他们能够用 Go 语言编写高性能的 PHP 扩展。

无论是利用 goroutines 实现并发任务,还是将 Go 生态的强大库引入,FrankenPHP 都极大地降低了开发门槛,同时保持了高性能和灵活性。随着 PHP 基金会对其官方支持的加强,FrankenPHP 及其 Go 扩展功能有望成为 PHP 生态的重要组成部分。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • FrankenPHP 简介
  • 为什么用 Go 编写 PHP 扩展?
  • FrankenPHP 的核心工具
    • 1. 扩展生成器:零 C 代码开发
    • 2. 工具库:简化类型转换
    • 3. Caddy 模块集成
  • 使用场景
  • 如何开始?
  • 注意事项
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档