PHP + Go 双语言融合:我在生产项目中实现的架构方案

前段时间做了个项目, 服务端主要是PHP写的, 部分用Go写, 现在说是我是如何进行结合的.

一、架构概述

本项目采用 PHP + Go 双语言混合部署架构

组件
技术栈
端口
说明
Web 服务
PHP + Nginx
80
主入口,处理业务逻辑
AI 服务
Go + Beego
88
AI 能力(出题、文档总结等)
下面的架构图, 仅供参考,我实际项目中还没用到这么多东西
图片

二、部署模式

2.1 单容器部署(当前生产模式)

# php-service.conf

[group:php-service]

programs=php-queue,go-service


[program:go-service]

command=/server-go/server-go          # Go 服务

directory=/server-go

autostart=true


[program:php-queue]

command=php think queue:listen

directory=/app/

2.2 双容器部署(可选)

还可以拓展更多的容器

┌─────────────────────────────────┐

│         Nginx (80)               │

│   ├── /     → PHP 容器:9000      │

│   └── /go/ → Go 容器:88          │

└─────────────────────────────────┘

         │

    ┌────┴────┐

    ▼         ▼

┌────────┐ ┌────────┐

│PHP 容器│ │Go 容器 │

│:9000   │ │:88     │

└────────┘ └────────┘

三、Go 服务配置

3.1 服务配置

// server-go/conf/app.conf appname = server-go httpport = 88          // Go 服务监听端口 runmode = dev autorender = false EnableDocs = true

3.2 Go API 路由

路径
方法
功能
/v1/ai/models
GET
获取支持的 AI 模型列表
/v1/ai/generate
POST
生成题目(单内容)
/v1/ai/question
POST
批量生成题目
/v1/ai/question/stream
POST
批量生成题目(SSE 流式)
/v1/ai/summary
POST
文档 URL 生成要点总结

四、请求调用方式

4.1 方式一:Nginx 代理(外部调用)

用户请求: https://example.com/go/v1/ai/summary

    │

    ▼

Nginx: location /go/ {

    proxy_pass http://127.0.0.1:88/;

}

    │

    ▼

Go 服务: /v1/ai/summary

4.2 方式二:PHP 内部调用(同容器内)

// config/safe.php

'go_server' => [

    'base_url' => 'http://127.0.0.1:88',  // 容器内访问

]


// app/adminapi/controller/go/AIController.php

$baseUrl = config('safe.go_server.base_url');

$url     = $baseUrl . '/v1/ai/summary';

$result  = (new RequestService())->post($url, $params);

优势:同容器内通过 127.0.0.1 调用,无需暴露 Go 服务端口到外部网络,安全性更高。

五、Nginx 配置详解

server {

    listen 80;


    # PHP 请求 → PHP-FPM 9000

    location ~ \.php$ {

        fastcgi_pass 127.0.0.1:9000;

        # ...

    }


    # /go/* 路径 → Go 服务 88 端口

    location /go/ {

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_pass http://127.0.0.1:88/;  # 关键:去除 /go/ 前缀

    }

}

七、配置变更注意事项

配置项
文件位置
说明
Go 服务地址
server/config/safe.php
go_server.base_url
Go 服务端口
server-go/conf/app.conf
httpport = 88
Nginx 路由
docker-save/nginx/{env}/vhost.conf
location /go/

修改配置后需重启对应服务:我直接跑阿里云流水线

两种调用方式

方式
路径
适用场景
外部访问
https://example.com/go/v1/ai/summary
外部系统调用
内部调用
http://127.0.0.1:88/v1/ai/summary
PHP 业务代码调用

关键配置

  • Go 服务端口
    server-go/conf/app.conf → httpport = 88
  • PHP 调用地址
    server/config/safe.php → go_server.base_url = 'http://127.0.0.1:88'
  • Nginx 路由
    location /go/ → proxy_pass http://127.0.0.1:88/

我当前生产模式

PHP 和 Go 部署在同一容器内,通过 Supervisor 管理进程,PHP 通过 127.0.0.1:88 内部调用 Go 服务,无需暴露 Go 端口到外部。

最后补充下, 我是通过阿里云流水线进行部署的.

如果发现代码有问题, 在部署历史里随时进行回滚操作.

附两张张对应的截图

图片
阿里云流水线
图片
以上的架构, 临时起意,就干了起来, 目前项目稳定运行中.项目中使用到的go框架Beego,  后面又发现了go-zero, 轻量级,推荐. 感觉Beego又不香了;B站有个Kratos, 这个是重量级的,不喜欢.
上一篇 开源 Puter,浏览器里跑完整桌面 OS!
下一篇 2026 年 Linux 服务器选型指南:别再无脑上 Ubuntu 了