Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在使用条令、dql和SQL的项目中使用条令缓存安全吗_Php_Symfony_Caching_Doctrine Orm_Doctrine - Fatal编程技术网

Php 在使用条令、dql和SQL的项目中使用条令缓存安全吗

Php 在使用条令、dql和SQL的项目中使用条令缓存安全吗,php,symfony,caching,doctrine-orm,doctrine,Php,Symfony,Caching,Doctrine Orm,Doctrine,我正在进行一个项目,其中条令缓存未处于活动状态。我们遇到了一些性能问题,我想知道激活条令缓存是否会导致可能的倒退 这就是为什么我要问这个问题: 我将3个缓存类型可视化: 元数据缓存驱动程序 结果缓存驱动程序 查询缓存驱动程序 对我来说最重要的是结果缓存驱动程序。我也不确定它是如何工作的。以下是我的想象: 我们有一本实体书。如果我们创建一个dql查询,或者使用findBy doctrine方法获取1975年编写的所有书籍,它将返回75本书。这个结果存储在缓存中,下次调用它时,它不会请求数据库,而是

我正在进行一个项目,其中条令缓存未处于活动状态。我们遇到了一些性能问题,我想知道激活条令缓存是否会导致可能的倒退

这就是为什么我要问这个问题:

我将3个缓存类型可视化:

元数据缓存驱动程序 结果缓存驱动程序 查询缓存驱动程序 对我来说最重要的是结果缓存驱动程序。我也不确定它是如何工作的。以下是我的想象:

我们有一本实体书。如果我们创建一个dql查询,或者使用findBy doctrine方法获取1975年编写的所有书籍,它将返回75本书。这个结果存储在缓存中,下次调用它时,它不会请求数据库,而是从缓存中获取结果

现在我们用DQL或doctrine$book->setYear1976更新实体。我猜实体书的缓存将被重置,下次我们请求所有1976年编写的书时,它将返回74本书

Bu如果我们使用SQL:updatebook set year=1976更新数据库会怎么样,其中id=XXX。当我们要求所有1975年写的书时,它会清除这个实体的缓存并请求DB吗?或者它仍然会使用缓存的结果并返回我们更新的图书,而这本书已经不是1975年的了

总而言之,有3种方法可以更新我们的数据库:

使用条令实体进行单一更新 使用dql查询 使用sql查询进行大规模更新
那么条令缓存结果是否考虑了这三种方式?或者在某些情况下,我们必须等待缓存timelife结束才能获得新的正确结果?

正如您所说,有三种缓存,它们对您的应用程序性能非常有用

查询缓存:多次解析没有意义,因为除非更改DQL查询,否则不会更改。所以,是的,使用查询缓存是有意义的,特别是在生产环境中,它将DQL查询的转换缓存到它的SQL对应项。例如,除了用户实现的搜索之外,我缓存所有查询以避免转换过程并获得性能

元数据缓存您的类元数据可以从几个不同的源(如YAML、XML、注释等)进行解析。我们不应该在每个请求上解析这些信息,而应该使用一个缓存驱动程序对其进行缓存。在生产环境中,类元数据不会更改。那么,为什么不让元数据缓存完成它的工作呢

结果缓存结果缓存可用于缓存查询的结果,这样我们就不必在第一次查询数据库后再次查询或添加数据。可以避免水合过程。您只需要配置结果缓存实现。 如果您的应用程序中有一些资源从未更改过国家/地区列表和城市列表,则应该使用它们并设置较长的缓存生存期以获得大量性能

如果您的数据在很多时候发生了变化,您可以避免缓存,但我认为条令缓存仍然很有用。例如,如果在代码中调用用户三次(一次测试访问令牌,一次测试安全性,最后一次设置其最后活动),则doctrine result cache将避免两次sql和两次缓存

如果您的数据只有在管理员更新在线商店中销售的商品的描述时才会更改,则应将其缓存。当管理员更新它们时,清除缓存

性能可通过验收测试进行评估。查看Codeception您可以在鉴定平台上安装应用程序,并清除和预热缓存。然后启动带有/不带缓存的测试,并可以比较执行时间