🐘

PHP 服务池

使用 Go 做 php 服务池,提高 PHP 项目性能
 

环境

需求安装好 PHP CLI 环境,参考:
# centos sudo yum install php-cli php-pdo php-mysqlnd php-zip php-gd php-mbstring php-curl php-xml php-pear php-json php-opcache php-redis -y # ubuntu sudo apt install php-cli php-pdo php-mysqlnd php-zip php-gd php-mbstring php-curl php-xml php-pear php-json php-opcache php-redis -y # Windows # 自行下载安装 PHP 确保命令行可用

PHP 端

默认情况下 Go 端 放在 PHP 项目根目录

安装

# 使用 composer 安装 composer require zls/saiyan
 

使用

与 ZlsPHP 整合
注册命令
// 修改 public/index.php Zls::initialize() ->setCommands([ 'saiyan' => '\Zls\Saiyan\Command\Saiyan', // 注册启动指令 // ... ])
提升性能
# 启用 Zend Opcache # php.ini 配置文件 zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.file_cache=/tmp # 使用 HugePage # 如何使用,自行百度 # 把项目打包能有效进一步提高性能 php zls run build
 
与 原生 PHP 整合
// 待补充
 
平滑重启
// PHP 业务内 \Zls\Action\ResidentMemory::restart(); // PHP 指令 php zls saiyan restart
注意事项
  • 不能使用 exit 之类强制终止代码,如需要使用 Z::end() 代替。
  • 谨慎使用静态属性之类,除非手动释放 (可在 __destruct 内处理),否则内存不会收回。
 

 

GO 端

 
自定义配置
w, err := saiyan.New(saiyan.ManualAllOption(func(conf *saiyan.Config) { conf.ReleaseTime = 1800 // 定时回收时间 // 更多配置 // conf.Command string // WorkerSum uint64 // MaxWorkerSum uint64 // MaxRequests uint64 // MaxWaitTimeout uint64 // MaxExecTimeout uint64 // StaticResourceDirs []string })
示例
package main import ( saiyan "github.com/sohaha/saiyan-go" "github.com/sohaha/zlsgo/zcli" "github.com/sohaha/zlsgo/znet" ) func main() { zcli.Version = "1.0.0" zcli.Name = "Saiyan" zcli.Run(run) } // 主要代码 func run() { r := znet.New() // 初始化服务 w, err := saiyan.New() if err != nil { r.Log.Fatal(err) } // 程序退出时同时关闭服务 defer w.Close() // 绑定服务 w.BindHttpHandler(r) r.SetAddr("127.0.0.1:8181") // 启动之后直接访问 http://127.0.0.1:8181 即可访问到 php 程序 znet.Run() }
 
JSON RPC
// 接口 type Demo struct {} func (d *Demo) TestMethod(input string, output *string) error { *output = "收到" + input return nil } // 注册 rpc, err := saiyan.RegisterRPC(&Demo{}) saiyan.New(func(conf *saiyan.Config) { conf.JSONRPC = rpc })
<?php # 控制器 use Zls\Saiyan\RPC; $result = RPC::fastCall('Demo.TestMethod',"测试");