golang嵌入式PHP处理插件库FrankenPHP的使用
golang嵌入式PHP处理插件库FrankenPHP的使用
FrankenPHP: 现代PHP应用服务器
FrankenPHP是一个基于Caddy Web服务器构建的现代PHP应用服务器。
FrankenPHP通过其出色的功能为您的PHP应用提供超能力:早期提示(Early Hints)、工作模式(worker mode)、实时功能、自动HTTPS、HTTP/2和HTTP/3支持…
FrankenPHP适用于任何PHP应用,并通过与工作模式的官方集成使您的Laravel和Symfony项目比以往更快。
FrankenPHP也可以作为独立的Go库使用,通过net/http
在任何应用中嵌入PHP。
开始使用
独立二进制文件
我们为Linux和macOS提供包含PHP 8.4和大多数流行PHP扩展的静态FrankenPHP二进制文件。
在Windows上,使用WSL运行FrankenPHP。
下载FrankenPHP或复制以下行到您的终端以自动安装适合您平台的版本:
curl https://frankenphp.dev/install.sh | sh
mv frankenphp /usr/local/bin/
要提供当前目录的内容,请运行:
frankenphp php-server
您也可以使用以下方式运行命令行脚本:
frankenphp php-cli /path/to/your/script.php
Docker
或者,可以使用Docker镜像:
docker run -v .:/app/public \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp
访问https://localhost
,开始体验!
Homebrew
FrankenPHP也可作为macOS和Linux的Homebrew包使用。
安装方法:
brew install dunglas/frankenphp/frankenphp
要提供当前目录的内容,请运行:
frankenphp php-server
Go库使用示例
以下是一个使用FrankenPHP作为Go库嵌入PHP的完整示例:
package main
import (
"fmt"
"net/http"
"github.com/dunglas/frankenphp"
"go.uber.org/zap"
)
func main() {
// 初始化FrankenPHP
if err := frankenphp.Init(frankenphp.WithLogger(zap.NewExample())); err != nil {
panic(err)
}
defer frankenphp.Shutdown()
// 创建HTTP处理程序
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 创建PHP请求上下文
req := frankenphp.NewRequestWithContext(r, "/path/to/your/script.php", nil)
// 执行PHP脚本
if err := frankenphp.ServeHTTP(w, req); err != nil {
http.Error(w, fmt.Sprintf("Error executing PHP: %v", err), http.StatusInternalServerError)
}
})
// 启动HTTP服务器
fmt.Println("Server started on :8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
panic(err)
}
}
文档
- 经典模式
- 工作模式
- 早期提示支持(103 HTTP状态码)
- 实时功能
- 高效提供大型静态文件
- 配置
- Docker镜像
- 生产部署
- 性能优化
- 创建独立、自执行的PHP应用
- 创建静态二进制文件
- 从源代码编译
- 监控FrankenPHP
- Laravel集成
- 已知问题
- 演示应用(Symfony)和基准测试
- Go库文档
- 贡献和调试
示例和骨架
- Symfony
- API Platform
- Laravel
- Sulu
- WordPress
- Drupal
- Joomla
- TYPO3
- Magento2
更多关于golang嵌入式PHP处理插件库FrankenPHP的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang嵌入式PHP处理插件库FrankenPHP的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
FrankenPHP: 在Go中嵌入PHP处理引擎
FrankenPHP是一个创新的Go库,允许开发者在Go应用程序中无缝嵌入PHP处理引擎。它为需要在Go环境中执行PHP代码的场景提供了强大的解决方案。
核心特性
- PHP与Go的无缝集成:在Go程序中直接执行PHP脚本
- 高性能:利用Go的并发特性处理PHP请求
- 简单API:易于使用的接口设计
- 跨平台支持:可在多种操作系统上运行
安装方法
go get github.com/dunglas/frankenphp
基本用法示例
package main
import (
"fmt"
"github.com/dunglas/frankenphp"
"net/http"
)
func main() {
// 初始化FrankenPHP
fphp, err := frankenphp.NewFrankenPHP()
if err != nil {
panic(err)
}
defer fphp.Close()
// 定义处理PHP文件的HTTP处理器
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 执行PHP脚本
output, err := fphp.ExecuteScript("index.php", nil)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 输出PHP执行结果
w.Header().Set("Content-Type", "text/html")
fmt.Fprint(w, output)
})
// 启动HTTP服务器
fmt.Println("Server running on :8080")
http.ListenAndServe(":8080", nil)
}
高级用法
1. 传递变量到PHP环境
vars := map[string]interface{}{
"name": "John Doe",
"age": 30,
"isAdmin": true,
}
output, err := fphp.ExecuteScript("welcome.php", vars)
在PHP中可以通过$_SERVER
或getenv()
访问这些变量。
2. 处理HTTP请求
http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
// 将Go的http.Request转换为PHP可用的格式
phpRequest := frankenphp.NewPHPRequest(r)
output, err := fphp.ExecuteScript("api.php", map[string]interface{}{
"_REQUEST": phpRequest,
})
// 处理输出...
})
3. 使用PHP函数
// 直接调用PHP函数
result, err := fphp.CallFunction("strtoupper", "hello world")
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println(result) // 输出: HELLO WORLD
}
性能优化技巧
- 复用PHP引擎:避免频繁创建和销毁PHP引擎实例
- 使用缓存:对频繁执行的PHP脚本结果进行缓存
- 并发处理:利用Go的goroutine处理多个PHP请求
- 预编译:对PHP脚本进行预编译或opcode缓存
实际应用场景
- 混合技术栈迁移:逐步将PHP应用迁移到Go
- 遗留系统集成:在Go应用中嵌入旧版PHP组件
- 模板引擎:使用PHP作为Go应用的模板系统
- 插件系统:允许用户通过PHP脚本扩展应用功能
注意事项
- 内存管理:PHP引擎可能占用较多内存
- 安全性:确保PHP脚本执行在安全沙箱中
- 错误处理:妥善处理PHP脚本中的错误和异常
- 版本兼容性:注意PHP版本与扩展的兼容性
FrankenPHP为Go与PHP的集成提供了强大而灵活的解决方案,特别适合需要同时利用两种语言优势的项目。通过合理的设计,可以构建出既保持Go高性能又兼容PHP生态的高效系统。