diff --git a/.example/database/gdb/mysql/config/gdb.go b/.example/database/gdb/mysql/config/gdb.go new file mode 100644 index 000000000..6fb30486b --- /dev/null +++ b/.example/database/gdb/mysql/config/gdb.go @@ -0,0 +1,37 @@ +package main + +import ( + "github.com/gogf/gf/database/gdb" + "sync" + "time" +) + +var db gdb.DB + +func init() { + gdb.AddDefaultConfigNode(gdb.ConfigNode{ + Host: "127.0.0.1", + Port: "3306", + User: "root", + Pass: "12345678", + Name: "test", + Type: "mysql", + Role: "master", + Charset: "utf8", + MaxOpenConnCount: 100, + }) + db, _ = gdb.New() +} + +func main() { + wg := sync.WaitGroup{} + for i := 0; i < 100000; i++ { + wg.Add(1) + go func() { + defer wg.Done() + time.Sleep(10 * time.Second) + db.Table("user").Where("id=1").All() + }() + } + wg.Wait() +} diff --git a/.example/database/gdb/mysql/gdb.go b/.example/database/gdb/mysql/gdb.go deleted file mode 100644 index c72bb7249..000000000 --- a/.example/database/gdb/mysql/gdb.go +++ /dev/null @@ -1,533 +0,0 @@ -package main - -import ( - "fmt" - "time" - - "github.com/gogf/gf/database/gdb" - "github.com/gogf/gf/frame/g" -) - -// 本文件用于gf框架的mysql数据库操作示例,不作为单元测试使用 - -var db gdb.DB - -// 初始化配置及创建数据库 -func init() { - gdb.AddDefaultConfigNode(gdb.ConfigNode{ - Host: "127.0.0.1", - Port: "3306", - User: "root", - Pass: "12345678", - Name: "test", - Type: "mysql", - Role: "master", - Charset: "utf8", - }) - db, _ = gdb.New() - - //gins.Config().SetPath("/home/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/.example/frame") - //db = g.Database() - - //gdb.SetConfig(gdb.ConfigNode { - // Host : "127.0.0.1", - // Port : 3306, - // User : "root", - // Pass : "123456", - // Name : "test", - // Type : "mysql", - //}) - //db, _ = gdb.Instance() - - //gdb.SetConfig(gdb.Config { - // "default" : gdb.ConfigGroup { - // gdb.ConfigNode { - // Host : "127.0.0.1", - // Port : "3306", - // User : "root", - // Pass : "123456", - // Name : "test", - // Type : "mysql", - // Role : "master", - // Weight : 100, - // }, - // gdb.ConfigNode { - // Host : "127.0.0.2", - // Port : "3306", - // User : "root", - // Pass : "123456", - // Name : "test", - // Type : "mysql", - // Role : "master", - // Weight : 100, - // }, - // gdb.ConfigNode { - // Host : "127.0.0.3", - // Port : "3306", - // User : "root", - // Pass : "123456", - // Name : "test", - // Type : "mysql", - // Role : "master", - // Weight : 100, - // }, - // gdb.ConfigNode { - // Host : "127.0.0.4", - // Port : "3306", - // User : "root", - // Pass : "123456", - // Name : "test", - // Type : "mysql", - // Role : "master", - // Weight : 100, - // }, - // }, - //}) - //db, _ = gdb.Instance() -} - -// 创建测试数据库 -func create() { - fmt.Println("create:") - _, err := db.Exec("CREATE DATABASE IF NOT EXISTS test") - if err != nil { - fmt.Println(err) - } - - s := ` - CREATE TABLE IF NOT EXISTS user ( - uid INT(10) UNSIGNED AUTO_INCREMENT, - name VARCHAR(45), - PRIMARY KEY (uid) - ) - ENGINE = InnoDB - DEFAULT CHARACTER SET = utf8 - ` - _, err = db.Exec(s) - if err != nil { - fmt.Println(err) - } - - s = ` - CREATE TABLE IF NOT EXISTS user_detail ( - uid INT(10) UNSIGNED AUTO_INCREMENT, - site VARCHAR(255), - PRIMARY KEY (uid) - ) - ENGINE = InnoDB - DEFAULT CHARACTER SET = utf8 - ` - - _, err = db.Exec(s) - if err != nil { - fmt.Println(err) - } - fmt.Println() -} - -// 数据写入 -func insert() { - fmt.Println("insert:") - r, err := db.Insert("user", gdb.Map{ - "name": "john", - }) - if err == nil { - uid, err2 := r.LastInsertId() - if err2 == nil { - r, err = db.Insert("user_detail", gdb.Map{ - "uid": uid, - "site": "http://johng.cn", - }) - if err == nil { - fmt.Printf("uid: %d\n", uid) - } else { - fmt.Println(err) - } - } else { - fmt.Println(err2) - } - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 基本sql查询 -func query() { - fmt.Println("query:") - list, err := db.GetAll("select * from user limit 2") - if err == nil { - fmt.Println(list) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// replace into -func replace() { - fmt.Println("replace:") - r, err := db.Save("user", gdb.Map{ - "uid": 1, - "name": "john", - }) - if err == nil { - fmt.Println(r.LastInsertId()) - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 数据保存 -func save() { - fmt.Println("save:") - r, err := db.Save("user", gdb.Map{ - "uid": 1, - "name": "john", - }) - if err == nil { - fmt.Println(r.LastInsertId()) - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 批量写入 -func batchInsert() { - fmt.Println("batchInsert:") - _, err := db.BatchInsert("user", gdb.List{ - {"name": "john_1"}, - {"name": "john_2"}, - {"name": "john_3"}, - {"name": "john_4"}, - }, 10) - if err != nil { - fmt.Println(err) - } - fmt.Println() -} - -// 数据更新 -func update1() { - fmt.Println("update1:") - r, err := db.Update("user", gdb.Map{"name": "john1"}, "uid=?", 1) - if err == nil { - fmt.Println(r.LastInsertId()) - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 数据更新 -func update2() { - fmt.Println("update2:") - r, err := db.Update("user", gdb.Map{"name": "john6"}, "uid=?", 1) - if err == nil { - fmt.Println(r.LastInsertId()) - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 数据更新 -func update3() { - fmt.Println("update3:") - r, err := db.Update("user", "name=?", "uid=?", "john2", 1) - if err == nil { - fmt.Println(r.LastInsertId()) - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 链式查询操作1 -func linkopSelect1() { - fmt.Println("linkopSelect1:") - r, err := db.Table("user u").LeftJoin("user_detail ud", "u.uid=ud.uid").Fields("u.*, ud.site").Where("u.uid > ?", 1).Limit(0, 2).Select() - if err == nil { - fmt.Println(r) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 链式查询操作2 -func linkopSelect2() { - fmt.Println("linkopSelect2:") - r, err := db.Table("user u").LeftJoin("user_detail ud", "u.uid=ud.uid").Fields("u.*,ud.site").Where("u.uid=?", 1).One() - if err == nil { - fmt.Println(r) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 链式查询操作3 -func linkopSelect3() { - fmt.Println("linkopSelect3:") - r, err := db.Table("user u").LeftJoin("user_detail ud", "u.uid=ud.uid").Fields("ud.site").Where("u.uid=?", 1).Value() - if err == nil { - fmt.Println(r.String()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 链式查询数量1 -func linkopCount1() { - fmt.Println("linkopCount1:") - r, err := db.Table("user u").Fields("uid").LeftJoin("user_detail ud", "u.uid=ud.uid").Where("u.uid=?", 1).Count() - if err == nil { - fmt.Println(r) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 错误操作 -func linkopUpdate1() { - fmt.Println("linkopUpdate1:") - r, err := db.Table("henghe_setting").Update() - if err == nil { - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 通过Map指针方式传参方式 -func linkopUpdate2() { - fmt.Println("linkopUpdate2:") - r, err := db.Table("user").Data(gdb.Map{"name": "john2"}).Where("name=?", "john_1").Update() - if err == nil { - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 通过字符串方式传参 -func linkopUpdate3() { - fmt.Println("linkopUpdate3:") - r, err := db.Table("user").Data("name='john3'").Where("name=?", "john2").Update() - if err == nil { - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// Where条件使用Map -func linkopUpdate4() { - fmt.Println("linkopUpdate4:") - r, err := db.Table("user").Data(gdb.Map{"name": "john11111"}).Where(g.Map{"uid": 1}).Update() - if err == nil { - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 链式批量写入 -func linkopBatchInsert1() { - fmt.Println("linkopBatchInsert1:") - r, err := db.Table("user").Data(gdb.List{ - {"name": "john_1"}, - {"name": "john_2"}, - {"name": "john_3"}, - {"name": "john_4"}, - }).Insert() - if err == nil { - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 链式批量写入,指定每批次写入的条数 -func linkopBatchInsert2() { - fmt.Println("linkopBatchInsert2:") - r, err := db.Table("user").Data(gdb.List{ - {"name": "john_1"}, - {"name": "john_2"}, - {"name": "john_3"}, - {"name": "john_4"}, - }).Batch(2).Insert() - if err == nil { - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 链式批量保存 -func linkopBatchSave() { - fmt.Println("linkopBatchSave:") - r, err := db.Table("user").Data(gdb.List{ - {"uid": 1, "name": "john_1"}, - {"uid": 2, "name": "john_2"}, - {"uid": 3, "name": "john_3"}, - {"uid": 4, "name": "john_4"}, - }).Save() - if err == nil { - fmt.Println(r.RowsAffected()) - } else { - fmt.Println(err) - } - fmt.Println() -} - -// 事务操作示例1 -func transaction1() { - fmt.Println("transaction1:") - if tx, err := db.Begin(); err == nil { - r, err := tx.Save("user", gdb.Map{ - "uid": 1, - "name": "john", - }) - tx.Rollback() - fmt.Println(r, err) - } - fmt.Println() -} - -// 事务操作示例2 -func transaction2() { - fmt.Println("transaction2:") - if tx, err := db.Begin(); err == nil { - r, err := tx.Table("user").Data(gdb.Map{"uid": 1, "name": "john_1"}).Save() - tx.Commit() - fmt.Println(r, err) - } - fmt.Println() -} - -// 主从io复用测试,在mysql中使用 show full processlist 查看链接信息 -func keepPing() { - fmt.Println("keepPing:") - for { - fmt.Println("ping...") - err := db.PingMaster() - if err != nil { - fmt.Println(err) - return - } - err = db.PingSlave() - if err != nil { - fmt.Println(err) - return - } - time.Sleep(1 * time.Second) - } -} - -// like语句查询 -func likeQuery() { - fmt.Println("likeQuery:") - if r, err := db.Table("user").Where("name like ?", "%john%").Select(); err == nil { - fmt.Println(r) - } else { - fmt.Println(err) - } -} - -// mapToStruct -func mapToStruct() { - type User struct { - Uid int - Name string - } - fmt.Println("mapToStruct:") - if r, err := db.Table("user").Where("uid=?", 1).One(); err == nil { - u := User{} - if err := r.ToStruct(&u); err == nil { - fmt.Println(r) - fmt.Println(u) - } else { - fmt.Println(err) - } - } else { - fmt.Println(err) - } -} - -// getQueriedSqls -func getQueriedSqls() { - for k, v := range db.GetQueriedSqls() { - fmt.Println(k, ":") - fmt.Println("Sql :", v.Sql) - fmt.Println("Args :", v.Args) - fmt.Println("Error:", v.Error) - fmt.Println("Func :", v.Func) - } -} - -func main() { - //data := g.Map{ - // "nickname" : "john", - //} - //db.SetDebug(true) - //r, err := db.Table("user").Where("id=1").Data(data).Update() - //fmt.Println(err) - //fmt.Println(r.RowsAffected()) - - //data2 := g.Map{ - // "adsys1" : "ss", - //} - //db.SetDebug(true) - //r, err := db.Table("cd_adsys").Where("adsys0=1").Data(data2).Update() - //fmt.Println(err) - //fmt.Println(r.RowsAffected()) - //return - //db.SetDebug(true) - //r, err := db.Table("test").Where("id=1").One() - //fmt.Println(r["datetime"]) - //fmt.Println(r["datetime"].Time().Date()) - //fmt.Println(err) - //create() - //create() - //insert() - //query() - //replace() - //save() - //batchInsert() - //update1() - //update2() - //update3() - linkopSelect1() - //linkopSelect2() - //linkopSelect3() - //linkopCount1() - //linkopUpdate1() - //linkopUpdate2() - //linkopUpdate3() - //linkopUpdate4() - // - //transaction1() - //transaction2() - // - //keepPing() - //likeQuery() - //mapToStruct() - //getQueriedSqls() -} diff --git a/.example/net/ghttp/server/session/session.go b/.example/net/ghttp/server/session/session.go index 111c73eec..7f1e0691a 100644 --- a/.example/net/ghttp/server/session/session.go +++ b/.example/net/ghttp/server/session/session.go @@ -4,12 +4,10 @@ import ( "github.com/gogf/gf/frame/g" "github.com/gogf/gf/net/ghttp" "github.com/gogf/gf/os/gtime" - "time" ) func main() { s := g.Server() - s.SetSessionMaxAge(61 * time.Second) s.BindHandler("/set", func(r *ghttp.Request) { r.Session.Set("time", gtime.Second()) r.Response.Write("ok") diff --git a/.example/net/ghttp/server/session/session_file.go b/.example/net/ghttp/server/session/session_file.go deleted file mode 100644 index 6725ecfc3..000000000 --- a/.example/net/ghttp/server/session/session_file.go +++ /dev/null @@ -1,30 +0,0 @@ -package main - -import ( - "github.com/gogf/gf/frame/g" - "github.com/gogf/gf/net/ghttp" - "github.com/gogf/gf/os/gtime" - "time" -) - -// SessionSet sets a test session key into the session storage. -func SessionSet(r *ghttp.Request) { - r.Session.Set("time", gtime.Second()) - r.Response.WriteJson("ok") -} - -// SessionGet shows all sessions stored. -func SessionGet(r *ghttp.Request) { - r.Response.WriteJson(r.Session.Map()) -} - -func main() { - s := g.Server() - s.SetConfigWithMap(g.Map{ - "SessionMaxAge": 3 * time.Second, - }) - s.BindHandler("/set", SessionSet) - s.BindHandler("/get", SessionGet) - s.SetPort(8199) - s.Run() -} diff --git a/.example/net/ghttp/server/session/session_map.go b/.example/net/ghttp/server/session/session_map.go deleted file mode 100644 index 835c2c815..000000000 --- a/.example/net/ghttp/server/session/session_map.go +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "fmt" - - "github.com/gogf/gf/frame/g" - "github.com/gogf/gf/net/ghttp" -) - -func main() { - s := g.Server() - s.SetSessionMaxAge(60) - s.BindHandler("/set", func(r *ghttp.Request) { - r.Session.Set("captcha", map[string]string{ - "key": "value", - }) - r.Response.Write("ok") - }) - s.BindHandler("/get", func(r *ghttp.Request) { - fmt.Println(r.Session.Get("captcha")) - r.Response.Write(r.Session.Get("captcha")) - }) - s.SetPort(8199) - s.Run() -} diff --git a/.example/net/ghttp/server/session/session_redis.go b/.example/net/ghttp/server/session/session_redis.go deleted file mode 100644 index 5c32c7466..000000000 --- a/.example/net/ghttp/server/session/session_redis.go +++ /dev/null @@ -1,32 +0,0 @@ -package main - -import ( - "github.com/gogf/gf/frame/g" - "github.com/gogf/gf/net/ghttp" - "github.com/gogf/gf/os/gsession" - "github.com/gogf/gf/os/gtime" - "time" -) - -// SessionSet sets a test session key into the session storage. -func SessionSet(r *ghttp.Request) { - r.Session.Set("time", gtime.Second()) - r.Response.WriteJson("ok") -} - -// SessionGet shows all sessions stored. -func SessionGet(r *ghttp.Request) { - r.Response.WriteJson(r.Session.Map()) -} - -func main() { - s := g.Server() - s.SetConfigWithMap(g.Map{ - "SessionMaxAge": 3 * time.Second, - "SessionStorage": gsession.NewStorageRedis(g.Redis()), - }) - s.BindHandler("/set", SessionSet) - s.BindHandler("/get", SessionGet) - s.SetPort(8199) - s.Run() -} diff --git a/net/ghttp/ghttp_server.go b/net/ghttp/ghttp_server.go index 182d0c5a2..ea1a2814d 100644 --- a/net/ghttp/ghttp_server.go +++ b/net/ghttp/ghttp_server.go @@ -255,10 +255,19 @@ func (s *Server) Start() error { // Default session storage. if s.config.SessionStorage == nil { - s.config.SessionStorage = gsession.NewStorageFile() + path := gfile.Join(s.config.SessionPath, s.name) + if !gfile.Exists(path) { + if err := gfile.Mkdir(path); err != nil { + glog.Fatalf("mkdir failed for '%s':", path, err) + } + } + s.config.SessionStorage = gsession.NewStorageFile(path) } // Initialize session manager when start running. - s.sessionManager = gsession.New(s.config.SessionMaxAge, s.config.SessionStorage) + s.sessionManager = gsession.New( + s.config.SessionMaxAge, + s.config.SessionStorage, + ) // PProf feature. if s.config.PProfEnabled { diff --git a/net/ghttp/ghttp_server_config.go b/net/ghttp/ghttp_server_config.go index 80d37e737..266eb1614 100644 --- a/net/ghttp/ghttp_server_config.go +++ b/net/ghttp/ghttp_server_config.go @@ -62,6 +62,7 @@ type ServerConfig struct { CookieDomain string // Cookie: 有效Domain(注意同时也会影响SessionID) SessionMaxAge time.Duration // Session: 有效期 SessionIdName string // Session: SessionId. + SessionPath string // Session: Session Storage path for storing session files. SessionStorage gsession.Storage // Session: Session Storage implementer. DenyIps []string // Security: 不允许访问的ip列表,支持ip前缀过滤,如: 10 将不允许10开头的ip访问 AllowIps []string // Security: 仅允许访问的ip列表,支持ip前缀过滤,如: 10 将仅允许10开头的ip访问 @@ -104,6 +105,7 @@ var defaultServerConfig = ServerConfig{ CookieDomain: "", SessionMaxAge: time.Hour * 24, SessionIdName: "gfsessionid", + SessionPath: gsession.DefaultStorageFilePath, LogStdout: true, ErrorStack: true, ErrorLogEnabled: true,