golang嵌入式PHP处理插件库FrankenPHP的使用

golang嵌入式PHP处理插件库FrankenPHP的使用

FrankenPHP: 现代PHP应用服务器

FrankenPHP

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

1 回复

更多关于golang嵌入式PHP处理插件库FrankenPHP的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


FrankenPHP: 在Go中嵌入PHP处理引擎

FrankenPHP是一个创新的Go库,允许开发者在Go应用程序中无缝嵌入PHP处理引擎。它为需要在Go环境中执行PHP代码的场景提供了强大的解决方案。

核心特性

  1. PHP与Go的无缝集成:在Go程序中直接执行PHP脚本
  2. 高性能:利用Go的并发特性处理PHP请求
  3. 简单API:易于使用的接口设计
  4. 跨平台支持:可在多种操作系统上运行

安装方法

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中可以通过$_SERVERgetenv()访问这些变量。

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
}

性能优化技巧

  1. 复用PHP引擎:避免频繁创建和销毁PHP引擎实例
  2. 使用缓存:对频繁执行的PHP脚本结果进行缓存
  3. 并发处理:利用Go的goroutine处理多个PHP请求
  4. 预编译:对PHP脚本进行预编译或opcode缓存

实际应用场景

  1. 混合技术栈迁移:逐步将PHP应用迁移到Go
  2. 遗留系统集成:在Go应用中嵌入旧版PHP组件
  3. 模板引擎:使用PHP作为Go应用的模板系统
  4. 插件系统:允许用户通过PHP脚本扩展应用功能

注意事项

  1. 内存管理:PHP引擎可能占用较多内存
  2. 安全性:确保PHP脚本执行在安全沙箱中
  3. 错误处理:妥善处理PHP脚本中的错误和异常
  4. 版本兼容性:注意PHP版本与扩展的兼容性

FrankenPHP为Go与PHP的集成提供了强大而灵活的解决方案,特别适合需要同时利用两种语言优势的项目。通过合理的设计,可以构建出既保持Go高性能又兼容PHP生态的高效系统。

回到顶部