我有两台 Web 服务器,每台服务器上都有一个 Magento 实例。每台服务器共享相同的 httpd.conf、php.ini 和 my.cnf,以及 local.xml 和 config.xml magento 配置文件。
我有另一台服务器,用于存储共享数据库和共享 Memcache 实例。两台 Magento Web 服务器都能够成功访问数据库实例,但只有其中一个 Magento 实例可以正常使用 Memcache。
当我向不与 memcache 一起工作的 magento 实例发出请求时,出现以下错误:
There has been an error processing your request
Warning: session_start() [function.session-start]: open(tcp://INTERNAL_IP_OF_MEMCACHE_SERVER:11211?persistent=1&weight=2&timeout=10&retry_interval=10/sess_9bmgdui99pr39fagpnoa53prl5, O_RDWR) failed: No such file or directory (2) in /var/www/html/production-host/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php on line 113
Trace:
#0 [internal function]: mageCoreErrorHandler(2, 'session_start()...', '/var/www/html/p...', 113, Array)
#1 /var/www/html/production-host/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php(113): session_start()
#2 /var/www/html/production-host/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php(153): Mage_Core_Model_Session_Abstract_Varien->start('frontend')
#3 /var/www/html/production-host/app/code/core/Mage/Core/Model/Session/Abstract.php(84): Mage_Core_Model_Session_Abstract_Varien->init('core', 'frontend')
#4 /var/www/html/production-host/app/code/core/Mage/Core/Model/Session.php(39): Mage_Core_Model_Session_Abstract->init('core', 'frontend')
#5 /var/www/html/production-host/app/code/core/Mage/Core/Model/Config.php(1206): Mage_Core_Model_Session->__construct(Array)
#6 /var/www/html/production-host/app/Mage.php(432): Mage_Core_Model_Config->getModelInstance('core/session', Array)
#7 /var/www/html/production-host/app/Mage.php(446): Mage::getModel('core/session', Array)
#8 /var/www/html/production-host/app/code/core/Mage/Core/Controller/Varien/Action.php(483): Mage::getSingleton('core/session', Array)
#9 /var/www/html/production-host/app/code/core/Mage/Core/Controller/Front/Action.php(59): Mage_Core_Controller_Varien_Action->preDispatch()
#10 /var/www/html/production-host/app/code/core/Mage/Core/Controller/Varien/Action.php(407): Mage_Core_Controller_Front_Action->preDispatch()
#11 /var/www/html/production-host/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('index')
#12 /var/www/html/production-host/app/code/core/Mage/Core/Controller/Varien/Front.php(177): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#13 /var/www/html/production-host/app/code/core/Mage/Core/Model/App.php(304): Mage_Core_Controller_Varien_Front->dispatch()
#14 /var/www/html/production-host/app/Mage.php(596): Mage_Core_Model_App->run(Array)
#15 /var/www/html/production-host/index.php(83): Mage::run('', 'store')
#16 {main}
我已成功从上述机器远程登录到 memcache 服务器的 11211 端口,并且可以正常连接到 memcache 实例。我还通过 php -m 确保每个系统都安装了正确的扩展,并对“php_info”的输出进行了差异化(它们是相同的)。
我意识到 session_start() 在连接到 memcache 实例时出现问题,但我不明白为什么?TIA!
编辑/更新:
这是 Magento 企业版本:我相信是 1.5(现在正在检查)并且 local.xml 是:
> <config> <global>
> <install>
> <date><![CDATA[REDACTED]]></date>
> </install>
> <crypt>
> <key><![CDATA[REDACTED]]></key>
> </crypt>
> <disable_local_modules>false</disable_local_modules>
> <resources>
> <db>
> <table_prefix></table_prefix>
> </db>
> <default_setup>
> <connection>
> <host><![CDATA[REDACTED]]></host>
> <username><![CDATA[REDACTED]]></username>
> <password><![CDATA[REDACTED]]></password>
> <dbname><![CDATA[REDACTED]]></dbname>
> <active>1</active>
> </connection>
> </default_setup>
> </resources>
> <session_save><![CDATA[memcached]]></session_save>
>
> <session_save_path><![CDATA[tcp://REDACTED:11211?persistent=1&weight=2&timeout=10&retry_interval=10]]></session_save_path>
> <session_cache_limiter></session_cache_limiter> <cache>
> <slow_backend>database</slow_backend>
> <fast_backend>Memcached</fast_backend> <fast_backend_options>
> <servers>
> <server>
> <host>REDACTED</host>
> <port>11211</port>
> <persistent>1</persistent>
> </server> </servers> </fast_backend_options>
>
> <backend>memcached</backend> <memcached> <servers>
> <server>
> <host>REDACTED</host>
> <port>11211</port>
> <persistent>1</persistent>
> </server> </servers> <compression><![CDATA[0]]></compression>
> <cache_dir><![CDATA[]]></cache_dir>
> <hashed_directory_level><![CDATA[]]></hashed_directory_level>
> <hashed_directory_umask><![CDATA[]]></hashed_directory_umask>
> <file_name_prefix><![CDATA[]]></file_name_prefix> </memcached>
> </cache> </global> <admin>
> <routers>
> <adminhtml>
> <args>
> <frontName><![CDATA[REDACTED]]></frontName>
> </args>
> </adminhtml>
> </routers> </admin> </config>
这些是调用“session_start”之前文件中的值:
[x] 方法 = memcached
[x] 保存路径 = tcp://REDACTED:11211?persistent=1&weight=2&timeout=10&retry_interval=10
更新:
我还创建了一个测试脚本,其中包含:
$fp = fsockopen('REDACTED', '11211');
if (!$fp)
{
我将其作为 apache 运行:
sudo -u apache php 测试.php
并且可以正常连接。
答案1
我建议考虑将会话存储和缓存存储都切换到 Redis。原因:
- Memcached 不适合 Magento 缓存,因为它严重依赖缓存标签。两级后端不必要地复杂且缓慢,我的Redis 后端支持无TwoLevels的标记。
- 使用非持久性缓存存储意味着如果您必须重新启动,您将拥有冷缓存。
- 使用非持久会话存储意味着如果您必须重新启动,则所有用户都会丢失他们的会话。
- Redis 速度极快。
Redis 可以配置最大内存限制。您可以运行两个实例来独立控制缓存和会话存储的大小(如果需要),并且可以配置为在缓存已满时使用 LRU 进行驱逐。
这phpredis 扩展支持本机会话存储插件,但我还没有使用 Magento 进行测试。
答案2
您应该先排除 Magento 的可能原因,然后开始调试问题。例如,常规 PHP 内存缓存会话是否有效?
尝试使用以下 test.php:
<?php
ini_set("session.save_handler","memcache");
ini_set("session.save_path","127.0.0.1:11211");
session_start();
print "Session started..\n<br />\n";
?>
如果可行,请查看代码(app/code/core/Mage/Core/Model/Session/Abstract/Varien.php)以查看 Magento 是否可能覆盖 save_path。
另外,您是否确定您的会话处理程序是 memcached? 使用 phpinfo() 的输出进行双重检查(在:已注册的会话处理程序下)。