Php Smarty缓存vs roll您自己的?

Php Smarty缓存vs roll您自己的?,php,caching,smarty,Php,Caching,Smarty,据我所知,在smarty中打开缓存时,smarty会缓存编译好的模板。然后可以使用这些编译好的模板来加速页面的呈现。在smarty应用程序上运行您自己的缓存级别不是一个好主意吗 if(a cache for this page exists){ -Don't run my application, don't include my files don't instantiate my classes. -Send the cached version of this page t

据我所知,在smarty中打开缓存时,smarty会缓存编译好的模板。然后可以使用这些编译好的模板来加速页面的呈现。在smarty应用程序上运行您自己的缓存级别不是一个好主意吗

if(a cache for this page exists){
    -Don't run my application, don't include my files don't instantiate my classes.
    -Send the cached version of this page to the user
    -end the script here
}else{//if the cache for this page does not exist or is not current
  - run my application as usual
  -save all the output to a file for next time
}
每当我的网站上发生更新此页面内容的问题时,例如管理员对网站内容进行更改时,删除缓存文件。我觉得我一定错过了什么。此方法允许我存储每个页面的所有html版本,并在有效时发送。这似乎会大大提高我的网站的速度

编辑:好的,我发现smarty实际上存储了我网站的html版本。如果缓存为当前缓存,则如何防止应用程序的其余部分运行。我是否只是先包含并实例化smarty,然后执行类似的操作

if($smarty->usingcache())[
exit;
}

如果你的网站是静态的,这将是可行的。但是那样的话,你就不需要Smarty了


假设您更新了数据库中的一条记录。然后,站点中包含直接或间接受更新影响的输出的所有页面都必须无效。您如何知道要使哪些页面无效?

在执行特定于请求的处理之前,您如何知道该页面的外观。在检查客户端的身份验证状态、执行一些数据库查询(或获取缓存结果)以获取最近的信息之前,您无法知道最近呈现的页面是否与这次呈现的页面相同。Smarty通过以下策略解决了这一问题:

  • 您的应用程序会响应请求,执行其所有域/业务逻辑
  • 您的应用程序使用模板变量填充smarty模板实例
  • Smarty生成模板和模板变量的散列
    • 如果哈希不在缓存中,Smarty将呈现模板并缓存它
    • 如果哈希在缓存中,Smarty将返回缓存的模板而不是呈现
    • 如果缓存已满,smarty将收回旧的缓存页面以腾出空间

默认情况下,Smarty使用文件系统进行缓存,但它认为缓存策略与任何键值存储兼容。事实上,其他商店也有插件,比如memcached。

实际上没有。在smarty中缓存渲染模板。我会更深入,根本不使用smarty,但这就是我:)是的,smarty不再那么好了。有什么更好的选择?我目前使用它提供交替主题版本的车辆库存服务,如果有其他更好的选择,我很乐意听到。@uoda,你想推荐一下吗。我发现smarty非常有用,但我总是乐于接受建议。是的,很好的一点,只要在数据库中添加新内容时删除所有缓存文件就行了。我想页面处理时间并不是一个限制因素。http请求在页面加载时间中起着更大的作用,因此我所描述的方法的优点可能不值得。但是smarty不也是这样做的吗?如果您对数据库进行更改,在缓存过期之前,您不会看到站点上的更改吗?这样会大大降低缓存的有效性。此外,您还需要在数据库更新的所有位置插入“删除所有缓存”代码。最终的结果是,通常透明的实现细节(缓存)现在必须在完全不相关的地方(db代码)处理,最重要的是,如果您忘记了什么或犯了错误,事情将无法正常工作。像这样耦合代码总是一个非常糟糕的主意。想想最坏的情况。使用Smarty的缓存,最多可以看到已过时X分钟的内容,其中X是在显式打开缓存时由您自己指定的。在你建议的方案中,最坏的情况是你会忘记在应该删除缓存的地方删除缓存。这将导致您的用户所看到的内容从未更新。那么,如果有新内容来自数据库,则缓存将重新生成?那么,为什么您不希望始终缓存您的站点?如果smarty始终检查缓存,为什么让缓存过期?缓存逐出会发生,以便在所有可用空间被消耗之前不会增加大小。想象一下,如果facebook上的每个页面视图都永远保留在某个服务器上;你的空间很快就用完了。虽然将最近查看的页面放在缓存中很有用(以避免重新呈现的成本),但内容越旧,重复使用的可能性就越小。好的,这是有道理的,尽管我认为如果缓存仍然有效,运行整个应用程序是一种浪费。也许你可以检查用户是否有访问权限,然后加载缓存的页面,否则就运行我的应用程序的其余部分。一旦你有足够的信息知道模板将是什么样子,你只需渲染模板,smarty就会从缓存中取出它(如果它在那里)。在这两种情况下都没有理由做额外的工作。