您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > go语言实践配合php开发
Golang实践配合 PHP 进行Web开发2012.09目录●Web应用的典型技术架构●PHP的谜思●毫无新意的 Golang●实践出真知●Q&AWeb应用的典型技术架构浏览器-服务器(B/S)Web应用的典型技术架构服务器处理后向浏览器输出HTML文本Web应用的典型技术架构CDN;Cache;LogicalService;Database;SearchEngine;。。。。。。。。。PHP的谜思PHP是最好的模板语言;容易学习,容易使用;超过千万网站使用它作为逻辑处理语言;拥有庞大而活跃的社区支持;但是……没有内建的并行机制。PHP的谜思支持并行是PHP社区的摩西之路。PHP的谜思stream_select();curl_mutil_xxx();pctrl_xxx();event_xxx();。。。毫无新意的 Golang●现代的、通用编程语言●编译为本地机器码●静态类型●简单的语法○类型推导●简明的类型系统●垃圾收集●内建并行支持毫无新意的 Golanggoroutine/channel毫无新意的 Golang 实践出真知场景A:在某系统中,一个PHP页面的操作除完成本地数据保存外(例如MySQL),还需要向某后台服务提交数据。该服务由于压力巨大,响应较慢,延迟较大(100ms)。实践出真知 实践出真知funcmain(){ w:=worker.New(worker.Unlimited) deferw.Close() w.AddServer(127.0.0.1:4730) w.AddFunc(ToUpper,ToUpper,worker.Immediately) w.AddFunc(ToUpperTimeOut5,ToUpper,5) w.Work()}funcToUpper(job*worker.Job)([]byte,error){ data:=[]byte(strings.ToUpper(string(job.Data))) returndata,nil}实践出真知 实践出真知场景B:某个页面需要多次调用不同的服务生成(30次调用)。各个服务之间数据的依赖关系较弱,调用相对独立。但由于调用服务较多,虽然每个服务的响应都很快,但是仍然导致PHP生成页面很慢。实践出真知CombineRPC实践出真知核心方法//同步RPC调用函数funcCall(rpcreq*RPCRequest)*RPCResponse//分解打包的RPC,并发起异步请求func AsyncCall(requestsRPCRequests,timeout int64)RPCResponses实践出真知AsyncCall主要逻辑//初始化l:= len(requests)rpcchan:= make(chan *RPCResponse,l) rslt:= make(RPCResponses,l)//发起异步请求for id,r:= range requests{ //RPCgoroutine}//获取结果for i:=0;il;i++{r:=-rpcchan;rslt[r.Id]=r}实践出真知RPCgoroutinegofunc(idstring,req*RPCRequest){ //设置超时 //省略代码 //构造一个异步调用后处理结果的channel c:=make(chan*RPCResponse,1) //利用goroutine进行异步RPC调用 gofunc(){c-Call(req)}() //超时判断 //channelselect } (id,r)实践出真知Channelselect//利用channel的select实现超时select{ caserpcresp:=-c: rpcresp.Id=id rpcchan-rpcrespcase-time.After(time.Duration(to)): rpcchan-&RPCResponse{//Timeout} //TODO:应当通知RPC终止请求}实践出真知场景C:问题在于,不是每个人都能快速学习,很好的掌握一门新的语言。旧系统有大量的PHP代码需要迁移,怎么办?实践出真知给Go内嵌一个PHP的SAPI解析环境php=NewPHP() php.Startup() deferphp.Close() iferr:=php.Eval(phpinfo(););err!=nil{ log.Fatal(err)}iferr:=php.Exec(foobar.php);err!=nil{ log.Fatal(err) }实践出真知Cgo总是能带来惊喜!func(php*PHP)Eval(scriptstring)(errerror){ iferr:=C.php_eval_script(C.CString(script));err!=nil{ returnerrors.New(C.GoString(err)) } return }实践出真知Gearman-Go:::欢迎大家加入我们!Q&ATHANKYOU!Alsothanksgoteam邢兴39健康网mikespook@gmail.com@mikespook
本文标题:go语言实践配合php开发
链接地址:https://www.777doc.com/doc-4043974 .html