Golang 实践 配合 PHP 进行 Web 开发 2012 09 目录 Web 应用的典型技术架构 PHP 的谜思 毫无新意的 Golang 实践出真知 Q curl mutil xxx pctrl xxx event xxx 毫无新意的 Golang 现代的 通用编程语言 编译为本地机器码 静态类型 简单的语法 类型推导 简明的类型系统 垃圾收集 内建并行支持 毫无新意的 Golang goroutine channel 毫无新意的 Golang 实践出真知 场景A 在某系统中 一个 PHP 页面的操作除完成本 地数据保存外 例如 MySQL 还需要向某后 台服务提交数据 该服务由于压力巨大 响应 较慢 延迟较大 100ms 实践出真知 实践出真知 func main w worker New worker Unlimited defer w Close w AddServer 127 0 0 1 4730 w AddFunc ToUpper ToUpper worker Immediately w AddFunc ToUpperTimeOut5 ToUpper 5 w Work func ToUpper job worker Job byte error data byte strings ToUpper string job Data return data nil 实践出真知 实践出真知 场景B 某个页面需要多次调用不同的服务生成 30 次调用 各个服务之间数据的依赖关系较 弱 调用相对独立 但由于调用服务较多 虽 然每个服务的响应都很快 但是仍然导致 PHP 生成页面很慢 实践出真知 CombineRPC 实践出真知 核心方法 同步 RPC 调用函数 func Call rpcreq RPCRequest RPCResponse 分解打包的 RPC 并发起异步请求 func AsyncCall requests RPCRequests timeout int64 RPCResponses 实践出真知 AsyncCall 主要逻辑 初始化 l len requests rpcchan make chan RPCResponse l rslt make RPCResponses l 发起异步请求 for id r range requests RPC goroutine 获取结果 for i 0 i l i r rpcchan rslt r Id r 实践出真知 RPC goroutine go func id string req RPCRequest 设置超时 省略代码 构造一个异步调用后处理结果的 channel c make chan RPCResponse 1 利用 goroutine 进行异步 RPC 调用 go func c Call req 超时判断 channel select id r 实践出真知 Channel select 利用 channel 的 select 实现超时 select case rpcresp c rpcresp Id id rpcchan rpcresp case time After time Duration to rpcchan err nil log Fatal err if err php Exec foobar php err nil log Fatal err 实践出真知 Cgo 总是能带来惊喜 func php PHP Eval script string err error if err C php eval script C CString script err nil return errors New C GoString err return 实践出真知 Gearman Go https bitbucket org mikespook gearman go CombineRPC https bitbucket org mikespook combinerpc GoEmPHP https bitbucket org mikespook goemphp 欢迎大家加入我们 Q A THANK YOU Also thanks go team 邢兴 39健康网 mikespook mikespook

展开阅读全文