Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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 Magento+;清漆&x2B;Memcache:会话_start()非常慢_Php_Session_Magento_Memcached_Varnish - Fatal编程技术网

Php Magento+;清漆&x2B;Memcache:会话_start()非常慢

Php Magento+;清漆&x2B;Memcache:会话_start()非常慢,php,session,magento,memcached,varnish,Php,Session,Magento,Memcached,Varnish,我们经营一家有清漆的Magento商店。除了以下问题外,一切正常:如果你打开一个商店页面,然后让浏览器打开很长时间,比如12-24小时,然后重新加载页面,页面加载速度非常慢(大约15秒) 我们在app/code/core/Mage/core/Model/session/Abstract.php中的start_session()调用中找到了问题。这个电话大约需要15秒 我们使用memcache(不是memcached)进行会话管理 我们在谷歌上搜索了很多,发现了很多关于会话启动缓慢的帖子,但没有一

我们经营一家有清漆的Magento商店。除了以下问题外,一切正常:如果你打开一个商店页面,然后让浏览器打开很长时间,比如12-24小时,然后重新加载页面,页面加载速度非常慢(大约15秒)

我们在app/code/core/Mage/core/Model/session/Abstract.php中的start_session()调用中找到了问题。这个电话大约需要15秒

我们使用memcache(不是memcached)进行会话管理

我们在谷歌上搜索了很多,发现了很多关于会话启动缓慢的帖子,但没有一篇是关于这个问题的

有人能帮忙吗

多谢各位,
蒂尔曼

我在《新遗址》上也看到了很多这方面的内容

从我所看到的几个不同的原因来看,我对这个问题没有完全的了解,但我最近一直在研究这个问题。以下是我的发现

Magento、Locking和New Relic中的会话

Magento中的每个控制器操作都使用会话,无论是否需要。会话在Mage_Core_Controller_Varien_Action::preDispatch中被急切地实例化

如果启用了会话锁定,这意味着在请求期间,会话将被锁定,直到请求完成。我还没有找到释放会话锁的代码,但我很确定它就在那里的某个地方

最终,这意味着如果您使用同一个会话从一个位置向Magento controller操作发出多个并发请求,则必须等待其中一些请求完成并解锁会话才能继续。我通常认为这是在NewRelic上的一个缓慢事务,停留在Mage_Core_Model_Session_Abstract_Varien::启动约30秒(我想我的会话锁等待超时)

在我看来,这份关于“新遗址”的报告有很多缺点

降低总平均响应时间,因为这些请求的速度比其他请求的速度要慢。 New Relic记录了最慢的事务的一个示例,如果我有性能瓶颈(例如20秒),New Relic将不会自动为我报告它们,如果同一URL受到会话锁定超时的困扰。超时正在隐藏有用的数据。 原因

我看到了一些常见的原因,但无论如何都不是一个确定的清单

机器人程序

像百度和Yandex这样的爬虫有点粗鲁,对网站造成了冲击。它们从一个位置运行,使用同一个会话发出大量请求,会话锁定机制失灵,因此在NewRelic中显示出缓慢的事务

对Magento控制器操作的Ajax调用

对于上漆的网站,必须小心地加载特定于客户的数据,有些网站通过使用ajax调用Magento后端来获取所需的数据来管理这些数据。我还看到一些网站使用ajax调用后端,以获取特定于产品的信息,例如商品在销售时的库存量

如果单个页面在页面加载时触发对后端的多个ajax调用,则可能触发会话锁定机制。ajax对Magento后端的调用越多,就越有可能遇到锁定

清漆ESI

实际上与上面一样,除了使用ajax调用之外,它使用了Edge-Side-Includes,这似乎是对后端的新调用

我的计划

我还没有采取行动,所以这仍然是纯粹的理论,但这是我在未来几个月内正在研究的事情

我在2016年Mage Titans UK大会上提出了这个问题,Fabrizio Branca向我指出了以下模块:

基于正则表达式,该模块将阻止机器人创建真正的会话,这样做的好处是不会命中会话锁,并且您的会话资源不会被粗鲁的机器人破坏。机器人不应该再污染你的新文物阅读了

对于ajax/ESI调用以在缓存页面上获取客户数据,我看不到您能做什么。您需要访问会话才能检索特定于客户的数据

但是,对于ajax/ESI调用以获取特定于目录的数据(例如有限库存),我认为根本不需要在该请求上存在会话。我未来的计划是试用Aoe_BlackHoleSession模块的扩展,这样我就可以将请求以无会话的方式发送到特定的URL

我不太熟悉ESI的内部结构,所以遗憾的是我没有太多的评论

备选方案


在会议期间,Fabrizio Branca说他能够完全禁用会话锁定而不会产生任何不良影响,测试风险由您自己承担。

更正:文件是app/code/core/Mage/core/Model/session/Abstract/**Varien.php**(不是app/code/core/Mage/core/Model/session/Abstract.php)-非常感谢您的回答,Abhinav!我们决定从Memcache切换到Redis作为会话存储,并关闭会话锁定。这似乎解决了这个问题。@AbhinavKumarSingh-这是一篇非常古老的帖子,但是当你逐字逐句地复制答案时,你真的应该相信原来的海报。