// Copyright 2018 gf Author(https://github.com/gogf/gf). All Rights Reserved. // // This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, // You can obtain one at https://github.com/gogf/gf. // Package gfcache provides reading and caching for file contents. package gfcache import ( "time" "github.com/gogf/gf/internal/cmdenv" "github.com/gogf/gf/os/gcache" "github.com/gogf/gf/os/gfile" "github.com/gogf/gf/os/gfsnotify" ) const ( // Default expire time for file content caching in seconds. gDEFAULT_CACHE_EXPIRE = time.Minute ) var ( // Default expire time for file content caching. cacheExpire = cmdenv.Get("gf.gfcache.expire", gDEFAULT_CACHE_EXPIRE).Duration() ) // GetContents returns string content of given file by from cache. // If there's no content in the cache, it will read it from disk file specified by . // The parameter specifies the caching time for this file content in seconds. func GetContents(path string, duration ...time.Duration) string { return string(GetBinContents(path, duration...)) } // GetBinContents returns []byte content of given file by from cache. // If there's no content in the cache, it will read it from disk file specified by . // The parameter specifies the caching time for this file content in seconds. func GetBinContents(path string, duration ...time.Duration) []byte { key := cacheKey(path) expire := cacheExpire if len(duration) > 0 { expire = duration[0] } r := gcache.GetOrSetFuncLock(key, func() interface{} { b := gfile.GetBytes(path) if b != nil { // Adding this to gfsnotify, // it will clear its cache if there's any changes of the file. _, _ = gfsnotify.Add(path, func(event *gfsnotify.Event) { gcache.Remove(key) gfsnotify.Exit() }) } return b }, expire) if r != nil { return r.([]byte) } return nil } // cacheKey produces the cache key for gcache. func cacheKey(path string) string { return "gf.gfcache:" + path }