diff --git a/TODO b/TODO index 7b1f2297b..fa2fbbde9 100644 --- a/TODO +++ b/TODO @@ -10,7 +10,7 @@ ON THE WAY: 9. orm增加更多数据库支持; 10. ghttp.Response增加输出内容后自动退出当前请求机制,不需要用户手动return,参考beego如何实现; 11. 当二进制参数为nil时,gjson.LoadContent并将gjson.Json对象ToMap时会报错; - +12. 改进控制器及执行对象注册,更友好地支持动态路由注册,例如:注册规则为 /channel/:name,现有的控制器及执行对象注册很难友好支持这种动态形式; DONE: diff --git a/g/net/ghttp/ghttp_server.go b/g/net/ghttp/ghttp_server.go index 871ac58ae..2541e6eec 100644 --- a/g/net/ghttp/ghttp_server.go +++ b/g/net/ghttp/ghttp_server.go @@ -223,8 +223,6 @@ func Wait() { // 开启底层Web Server执行 func (s *Server) startServer(fdMap listenerFdMap) { - // 开始执行底层Web Server创建,端口监听 - var server *gracefulServer var httpsEnabled bool if len(s.config.HTTPSCertPath) > 0 && len(s.config.HTTPSKeyPath) > 0 { // ================ @@ -249,30 +247,21 @@ func (s *Server) startServer(fdMap listenerFdMap) { if len(v) == 0 { continue } - go func(addrItem string) { - fd := 0 - addr := addrItem - array := strings.Split(addrItem, "#") - if len(array) > 1 { - addr = array[0] - // windows系统不支持文件描述符传递socket通信平滑交接,因此只能完整重启 - if runtime.GOOS != "windows" { - fd = gconv.Int(array[1]) - } + fd := 0 + addr := v + array := strings.Split(v, "#") + if len(array) > 1 { + addr = array[0] + // windows系统不支持文件描述符传递socket通信平滑交接,因此只能完整重启 + if runtime.GOOS != "windows" { + fd = gconv.Int(array[1]) } - if fd > 0 { - server = s.newGracefulServer(addr, fd) - } else { - server = s.newGracefulServer(addr) - } - s.servers = append(s.servers, server) - if err := server.ListenAndServeTLS(s.config.HTTPSCertPath, s.config.HTTPSKeyPath); err != nil { - // 如果非关闭错误,那么提示报错,否则认为是正常的服务关闭操作 - if !strings.EqualFold(http.ErrServerClosed.Error(), err.Error()) { - glog.Error(err) - } - } - }(v) + } + if fd > 0 { + s.servers = append(s.servers, s.newGracefulServer(addr, fd)) + } else { + s.servers = append(s.servers, s.newGracefulServer(addr)) + } } } // ================ @@ -292,28 +281,34 @@ func (s *Server) startServer(fdMap listenerFdMap) { if len(v) == 0 { continue } - go func(addrItem string) { - fd := 0 - addr := addrItem - array := strings.Split(addrItem, "#") - if len(array) > 1 { - addr = array[0] - // windows系统不支持文件描述符传递socket通信平滑交接,因此只能完整重启 - if runtime.GOOS != "windows" { - fd = gconv.Int(array[1]) - } + fd := 0 + addr := v + array := strings.Split(v, "#") + if len(array) > 1 { + addr = array[0] + // windows系统不支持文件描述符传递socket通信平滑交接,因此只能完整重启 + if runtime.GOOS != "windows" { + fd = gconv.Int(array[1]) } - if fd > 0 { - server = s.newGracefulServer(addr, fd) + } + if fd > 0 { + s.servers = append(s.servers, s.newGracefulServer(addr, fd)) + } else { + s.servers = append(s.servers, s.newGracefulServer(addr)) + } + } + // 开始执行异步监听 + for _, v := range s.servers { + go func(server *gracefulServer) { + var err error + if server.isHttps { + err = server.ListenAndServeTLS(s.config.HTTPSCertPath, s.config.HTTPSKeyPath) } else { - server = s.newGracefulServer(addr) + err = server.ListenAndServe() } - s.servers = append(s.servers, server) - if err := server.ListenAndServe(); err != nil { - // 如果非关闭错误,那么提示报错,否则认为是正常的服务关闭操作 - if !strings.EqualFold(http.ErrServerClosed.Error(), err.Error()) { - glog.Error(err) - } + // 如果非关闭错误,那么提示报错,否则认为是正常的服务关闭操作 + if err != nil && !strings.EqualFold(http.ErrServerClosed.Error(), err.Error()) { + glog.Error(err) } }(v) } @@ -321,6 +316,11 @@ func (s *Server) startServer(fdMap listenerFdMap) { s.status = 1 } +// 热重启Web Server +func (s *Server) Reload() { + sendProcessMsg(gproc.Pid(), gMSG_RELOAD, nil) +} + // 重启Web Server func (s *Server) Restart() { sendProcessMsg(gproc.Pid(), gMSG_RESTART, nil) diff --git a/g/net/ghttp/ghttp_server_admin.go b/g/net/ghttp/ghttp_server_admin.go index 3f5778e68..11c09ea9c 100644 --- a/g/net/ghttp/ghttp_server_admin.go +++ b/g/net/ghttp/ghttp_server_admin.go @@ -10,6 +10,7 @@ package ghttp import ( "strings" "gitee.com/johng/gf/g/os/gview" + "runtime" ) // 用于服务管理的对象 @@ -26,15 +27,26 @@ func (p *utilAdmin) Index(r *Request) {