Golang连接php-fpm.service时Accept后代码无响应问题排查
问题分析与解决:Go代码无法接收php-fpm连接
你的代码核心错误在于使用了错误的网络类型:
php-fpm监听的是TCP端口9000(你确认服务运行正常且监听该端口),但你调用net.Listen时传入的第一个参数是"unix"——这是用于Unix域套接字的类型,和TCP协议完全不兼容。
这导致你的listener实际上并没有绑定到9000 TCP端口,而是在等待Unix套接字的连接,自然永远无法接收到php-fpm的请求,Accept()会一直阻塞,后续的log.Print("a")也就永远不会执行。
修正后的代码
package main import ( "log" "net" ) func main() { // 将网络类型从"unix"改为"tcp",匹配php-fpm的监听协议 listener, err := net.Listen("tcp", "127.0.0.1:9000") if err != nil { log.Fatal("Connection error: ", err) } defer listener.Close() // 确保程序退出时关闭监听资源 for { fd, err := listener.Accept() if err != nil { log.Printf("Accept error: %v", err) continue // 用continue替代Fatal,避免单个错误导致程序退出 } log.Print("a") // 启动goroutine处理连接,避免阻塞主循环 go func(conn net.Conn) { defer conn.Close() // 此处可添加处理php-fpm请求的逻辑 }(fd) } }
额外注意事项
- 先确认php-fpm的监听类型:用
ss -tulpn | grep 9000命令检查,确保它确实在监听TCP端口而非Unix套接字(部分默认配置会用/run/php-fpm.sock这类Unix套接字)。 - 处理连接时建议用goroutine,否则主循环会被单个连接阻塞,无法接收后续请求。
内容的提问来源于stack exchange,提问作者DFG
相关产品推荐
相关产品推荐

