首先应该做的是:设置或缓存对象


What should be first: setting or cache object

我有一个非常基本的问题让我抓狂。我保持我自己的小框架。我可以用YAML/JSON/XML/任何设置文件配置框架。框架还使用缓存(memcached/couchbase/任何缓存,甚至是基于文件的缓存,如果没有安装缓存服务器)。

所以没有,我有以下问题:我喜欢缓存我的设置解析的设置文件在缓存中,但我想定义在设置文件中使用的缓存类型。

什么是合适的解决方案?我无法想象我应该如何处理这个问题,这让我想到我的框架可能有一个非常基本的设计/架构错误。有解决办法吗?

根据我从Symfony1和Symfony2获得的经验,尽可能多地缓存。

在他们的生产环境中,所有的东西都是缓存的,所以你会遇到你的问题,缓存类型是在设置文件中描述的,而设置文件本身就是缓存的。

正确的解决方案是:在Symfony中:删除prod中的缓存,一旦你改变了设置。

对于dev,设置总是被重新读取,因为你没有在调试中配置文件,所以开发的便捷性比引导时间更重要。

我建议像symfony那样拆分它。对于prod,您的设置很少更改,因此解析可以缓存的文件会浪费资源,并且速度通常在prod中优先级为1。

编辑:关于启动顺序的选项:

  • 总是先读取设置,然后决定需要哪个缓存。
  • 使用硬编码的设置配置缓存(例如基于文件的)

我建议使用选项2。您的框架是缓存无关的,因为这可以配置,这很好,但对于框架的基本设置,您根本不需要它。你不希望设置不同的缓存机制,如memcache, sql等只是为了基本的设置。

Symfony以最有效的方式解决了这个问题,因为它为设置提供了一个默认的缓存生成,这只是一个php文件。这一切。当symfony加载设置时,它查找要包含的某个文件,如果它不存在,symfony通过创建纯php缓存它,然后读取它。

可以通过文件扩展名来确定文件类型。然后可以读取缓存类型并创建缓存。缓存应该是单例的。

对于缓存的创建,我将使用抽象工厂,其实现依赖于文件类型。然后,抽象工厂的适当实现可以读取设置文件并创建正确的缓存。