从 PHP 到 Go:一个老 PHP 的转型路线图
写了 10 年 PHP(Yii2 → Laravel → Swoole),2022 年开始转 Go。两年下来主导了核心服务 PHP → Go 的重构。经常有人问"老 PHP 转 Go 怎么走",这篇是我的完整路线图。
一、先回答最核心的问题:要不要转
先别急着转,想清楚这三点:
- 业务有没有高并发压力?PHP 的瓶颈在常驻进程和并发模型(PHP-FPM 每请求一个进程),如果你的服务 QPS 上千就要想,几十就再等等
- 团队有没有 Go 场景?转语言不是为了简历好看,是团队真有微服务/高并发要用 Go 的场景
- 你愿不愿意重新当三个月新手?Go 上手快,但写出"PHP 味的 Go"很容易,真正内化要半年+
我的判断标准:业务逼你转 + 团队支持转 + 你自己想转,三个都满足才转。
二、学习路线(按顺序)
第一阶段:语法速通(2 周)
不要看大部头,直接:
A Tour of Go官方教程走一遍(半天)- 写 10 个 LeetCode 简单题(熟悉切片、map、错误处理)
- 读一遍《Go 语言圣经》并发章节(goroutine/channel 是重点)
关键:忘掉 PHP 的思维。PHP 是"每请求一脚本",Go 是"长驻进程 + 并发",心态先切换。
第二阶段:Web 实战(3-4 周)
- 用 Gin 写一个 CRUD 服务,带 JWT 鉴权 + MySQL
- 学会
context(超时、取消是 Go 的核心哲学) - 学会结构体 + JSON 序列化(对比 PHP 的数组,Go 的强类型让你难受一个月,之后再也回不去)
第三阶段:并发与工程化(6-8 周)
- goroutine + channel 模式:worker pool、fan-out/fan-in
- 生产要用的东西:
pprof性能分析、错误处理规范、配置管理、日志库选型 - 读自己团队的 Go 代码:找一个你熟悉的业务模块,看懂别人怎么写的
第四阶段:上生产(持续)
不要等学完才动手,找一个低风险模块(比如一个内部管理接口)用 Go 重写上线,让业务逼你成长。
三、踩过的坑(价值最高)
坑 1:用 PHP 的方式写 Go
|
|
Go 的错误处理不是啰嗦,是显式。if err != nil 写多了就懂:没有异常机制的语言里,错误必须被看见、被处理或被记录。
坑 2:goroutine 泄漏
|
|
goroutine 和 PHP 进程完全不同:PHP 进程结束就清理,goroutine 泄漏会慢慢吃光内存。上线第一课就是 pprof goroutine 排查泄漏。
坑 3:interface{} 滥用
转 Go 初期最想把一切变成 interface{}(就是 PHP 的数组/混合类型)。结果:类型安全感全丢,到处断言。
正确姿势:能用强类型就用强类型,interface{} 只用在边界(JSON 解析、反射)。
坑 4:panic 当异常用
PHP 有 try-catch,Go 的 panic 不是异常——panic 会炸掉整个进程。业务错误一律 return error,panic 只留给"程序不可能继续运行"的场景(如配置缺失、端口被占)。
四、什么时候算"转型成功"
我的判断标准:
- 新代码不用翻译 PHP 思维,直接写 Go 习惯的代码
- 能看懂 pprof 火焰图,能定位 goroutine 泄漏
- 敢在生产上写并发代码(channel、并发安全)
- 被问"Go 和 PHP 并发模型区别"能讲 10 分钟
平均需要 6 个月到 1 年。别焦虑,Go 的上手曲线比 PHP 陡一点点,但天花板高很多。
五、写在最后
转 Go 最大的收获不是语言本身,是思维升级:从"请求处理"思维到"系统架构"思维,从"脚本"到"工程"。PHP 教会我快速交付,Go 教会我严谨工程——两个都值得。
如果你正在纠结转不转,记住:转型不是放弃 PHP,是给职业生涯加一条更长的跑道。