草庐IT

php - 为什么 Magento 在产品保存时使整页缓存失效实际上使页面未缓存以及由于未缓存而刷新会做什么

coder 2023-06-14 原文

所以缓存当然是我在 Magento 中最困惑的地方,我相信大多数其他人也是如此。目前我们工作的网站之一是企业网站,当然使用 FPC。问题是,我们有一个每 15 分钟运行一次的库存更新。很多订单都是通过电话和通过目录发送到 CSR 的,然后输入到 Magento 之外的外部系统中。

每 15 分钟运行一个脚本来检查该系统中的任何库存,看看它是否与 Magento 中的不同。如果存在差异,则会在 Magento 中更新库存。使用所有 Magento 方法,没有 sql 或类似的东西。

我们一直有缓存问题,并且在它们出现时尝试了所有最新技术。我们正在尝试的最新一个是 Redis,我们已经在其他网站上使用它取得了很好的成功。然而,我们仍然看到服务器上的负载过大,而且很明显页面没有被缓存。

深入研究代码后发现,每次模型保存或管理产品 Controller 保存后,它都会查看是否需要使缓存失效。似乎更改任何属性,至少库存会将 FPC 标记为需要失效。

我对失效的含义感到困惑,因为不久前我们向客户支持提出了一个关于类似问题的问题,这就是答复

Full Page cache will get to invalidated state upon any changes on the products, categories, CMS even when the stock is decreased after a sale.

Now when full page cache gets to invalidated state this does not mean that something is changed on your frontend however any changes applied after the last refresh will not be shown on the frontend.

However if having the FPC validated at all times is a must for your business logic you could certainly set your Magento Installation to refresh it automatically through cron functionality as often as you desire.

然而,在我所做的所有测试中,在 1.9 和 1.11 Enterprise 上,当 FPC 无效时,似乎没有从缓存中提取响应。这与他们所说的只是没有较新的更新是矛盾的。

有什么我想念的吗?有没有人能很好地解释 Magento 中的失效是如何专门针对 FPC 或任何好的链接来完全理解流程和代码的?

您可以自己对全页缓存的任何页面进行尝试。但据我了解,/app/code/core/Mage/Core/Model/Cache.php 中的方法 processRequest 应该使用缓存的响应设置正文内容,并且如果页面被缓存,则返回 true。

要测试转到任何页面,请确保将其缓存并返回 true。进入并编辑产品,在我们的例子中是数量。这将使 FPC 失效。但是现在当你加载之前缓存的页面时,它会在此方法中返回 false 而不是缓存页面。我不知道这是否准确,无法判断页面是否被缓存,但这是我的调查引导我的地方。如果我错了,请纠正我。

更新: 经过进一步调查,我发现当您在管理员中保存产品时, Controller 操作

Mage_Adminhtml_Catalog_ProductController::saveAction()

会调用下面的方法

Mage::getModel('catalogrule/rule')->applyAllRulesToProduct($productId)

然后在 Mage_CatalogRule_Model_Resource_Rule 类中,调用 applyAllRulesForDateRange 方法并触发事件

catalogrule_after_apply

全页缓存模块正在观察并触发 FPC 标记的清理缓存方法。基本上删除所有 FPC 缓存记录。

如果在此之前逻辑是清除绑定(bind)到产品和类别标签的 FPC 记录,我不明白为什么这是必要的。这是错误吗?

最佳答案

FPC 正在观察库存变化,因为其目的是显示所有已减至零库存的产品缺货。解决方法是在产品达到零时而不是每次任何产品更换库存时创建事件调度,并重写 FPC 以观察该事件而不是原始事件。

另一种方法是仅使与正在更新的产品相关的缓存部分无效,但这将是一个相当重要的架构更改。

关于php - 为什么 Magento 在产品保存时使整页缓存失效实际上使页面未缓存以及由于未缓存而刷新会做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10988132/

有关php - 为什么 Magento 在产品保存时使整页缓存失效实际上使页面未缓存以及由于未缓存而刷新会做什么的更多相关文章

  1. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  4. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  5. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

  6. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  7. ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态? - 2

    s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成

  8. ruby - 在 ASP 页面上 Mechanize 中断 - 2

    require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie

  9. 由于 libgmp.10.dylib 的问题,Ruby 2.2.0 无法运行 - 2

    我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro

  10. ruby-on-rails - prawnto 显示新页面时不会中断的表格 - 2

    我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.

随机推荐