FrankenPHP 扩展开发指南

func repeat_this(s *C.zend_string, n int64) unsafe.Pointer {

文本版 · 供搜索与朗读

FrankenPHP 扩展开发指南

bolt
高性能原生扩展

FrankenPHP
扩展开发指南

使用 Go 语言编写 PHP 扩展,释放协程并发潜力

rocket_launch
核心优势

check_circle
无需 C 代码:纯 Go 开发,避开复杂的 C/CGO

check_circle
高性能并发:直接利用 Goroutines 协程模型

check_circle
生态复用:无缝使用现有 Go 库生态

schema
类型系统

提供公共类型 API,自动处理 PHP 与 Go 间的类型转换。

data_object支持 Int, Float, Bool

text_fieldsString: frankenphp.GoString

view_listArray: frankenphp.Array

code
定义 PHP 函数

// 使用指令注释定义 PHP 函数签名
//export_php:function repeat_this(string $str, int $n): string
func repeat_this(s *C.zend_string, n int64) unsafe.Pointer {
// Go 转换辅助函数
str := frankenphp.GoString(unsafe.Pointer(s))
result := strings.Repeat(str, int(n))

// 返回 PHP 兼容类型
return frankenphp.PHPString(result, false)
}

timeline
开发流程

1

创建模块

go mod init ...

2

编写扩展

定义函数与类

3

生成存根

extension-init

4

编译集成

嵌入 FrankenPHP

extension
高级特性

不透明类

使用 //export_php:class 封装 Go 结构体

类方法

通过方法暴露行为,保障内部状态安全

常量导出

支持全局常量与类常量的跨语言共享

GoLang
PHP 8.2+
Worker Mode

auto_awesome
frankenphp.dev

👍 1

想参与讨论或点赞?登录后使用完整功能

讨论回复(1)

文本版 · 供搜索与朗读

FrankenPHP Worker 模式指南

speed
高性能常驻内存模式

FrankenPHP
Worker 模式指南

启动一次,常驻内存 · 毫秒级响应请求

lightbulb
核心概念

memory
内存常驻
应用启动后保存在内存中,避免重复加载开销

bolt
极速响应
请求处理时间缩短至毫秒级

terminal
docker run -e FRANKENPHP_CONFIG="worker /app/script.php" dunglas/frankenphp

code
Worker 脚本结构

// 1. 引导应用 (仅执行一次)
$app = require 'bootstrap.php';

// 2. 定义请求处理器
$handler = function() use ($app) {
// 超全局变量会被自动重置
echo $app->handle($_GET, $_POST);
};

// 3. 请求处理循环
while (frankenphp_handle_request($handler)) {
// 可选: 请求后处理与垃圾回收
gc_collect_cycles();
}

注意:传统 PHP 库可能存在内存泄漏。建议配置 MAX_REQUESTS 环境变量定期重启 Worker 进程。

tune
配置选项

chevron_right
Worker 数量
默认: CPU核心数 × 2

chevron_right
热重载
--watch 监控文件变更

chevron_right
优雅重启
Admin API 触发

autorenew
生命周期管理

1

启动引导

2

监听请求

3

处理/重载

Worker 崩溃时采用指数退避策略自动重启,防止频繁崩溃导致系统过载。

PHP 8.2+
Go Runtime
Caddy

menu_book
frankenphp.dev/docs/worker

👍 1
合作

智谱 GLM-5 已上线

在智谱开放平台 BigModel.cn 打造 AI 应用。新一代旗舰模型 GLM-5 在推理、代码、智能体综合能力达到开源模型 SOTA。

领取 2000万 Tokens