Memcached - 为什么不存储数据?

时间:2013-07-21 03:05:54

标签: php magento zend-framework memcached

我实际上是想了解为什么memcached没有存储给定ID的数据。

我正在使用基于Zend Framework 1.11.1的Magento EE 1.11.2.0。 用于处理memcached的接口是Zend_Cache_Backend_Memcached

现在这里没有这么大的自定义代码,这是我保存缓存的自定义容器:

public function saveCache($blockContent)
{

    $lifeTime = 86400 * 30 * 6;
    $tags = array(
        My_Module_Model_PageCache_Container_Category_Blabla::CACHE_TAG
    );
    $cacheId = $this->_getCacheId();

    if ($cacheId !== false) {
        $this->_saveCache($blockContent, $cacheId, $tags, $lifeTime);
    }
    return $this;
}

我只是强迫magento使用我的自定义cache tag和固定lifetime(memcache不支持自定义标记,所以我猜这不是问题)我的lifetime在memcached中没有使用,因为我可以看到使用了默认值。

一开始我认为这个问题是由一个长缓存ID引起的,但现在在减少它之后(< 31 char)这对我没有帮助:

我可以看到load()方法Zend_Cache_Backend_Memcached对于我的缓存ID总是返回false。 虽然save()方法返回true,就像它被缓存一样。

这是我的local.xml配置:

<cache>
        <slow_backend_store_data>1</slow_backend_store_data>
        <auto_refresh_fast_cache>0</auto_refresh_fast_cache>
        <backend>memcached</backend>
        <slow_backend>database</slow_backend>
        <memcached>
            <servers>
                <!--<server>-->
                <!--<host><![CDATA[127.0.0.1]]></host>-->
                <!--<port><![CDATA[11213]]></port>-->
                <!--<persistent><![CDATA[1]]></persistent>-->
                <!--</server>-->

                <server>
                    <host><![CDATA[unix:///tmp/memcached.sock]]></host>
                    <port><![CDATA[0]]></port>
                    <persistent><![CDATA[0]]></persistent>
                    <weight><![CDATA[2]]></weight>
                    <timeout><![CDATA[5]]></timeout>
                </server>
            </servers>
            <compression><![CDATA[0]]></compression>
            <hashed_directory_level><![CDATA[]]></hashed_directory_level>
            <hashed_directory_umask><![CDATA[]]></hashed_directory_umask>
            <file_name_prefix><![CDATA[]]></file_name_prefix>
        </memcached>
    </cache>
    <full_page_cache>
        <backend>memcached</backend>
        <slow_backend>database</slow_backend>
        <slow_backend_store_data><![CDATA[1]]></slow_backend_store_data>
        <memcached>
            <servers>
                <server>
                    <host><![CDATA[unix:///tmp/memcached.sock]]></host>
                    <port><![CDATA[0]]></port>
                    <persistent><![CDATA[0]]></persistent>
                    <weight><![CDATA[2]]></weight>
                    <timeout><![CDATA[10]]></timeout>
                    <retry_interval><![CDATA[10]]></retry_interval>
                    <status><![CDATA[1]]></status>
                    <stats_update_factor><![CDATA[1]]></stats_update_factor>
                </server>
            </servers>
        </memcached>
    </full_page_cache>

我还尝试使用此命令检查memcached的条目以查看我的id是否已存储:

echo 'stats cachedump 35 35' | sudo nc -U /tmp/memcached.sock

  • 有关于此原因的任何想法吗?
  • 我该如何调试? (我不能使用xdebug进入Zend_Cache_Backend_Memcached

2 个答案:

答案 0 :(得分:3)

您可以使用-vv重新启动memcached并查看交互。

BTW,memcache的默认端口是11211.FYI

答案 1 :(得分:3)

这里的问题是$ lifetime和Zend_Cache_Backend_Memcached中的相对错误。

Memcached的最长生命周期为30天(2592000),因此我使用它的限制太大,这就是数据未存储的原因。

不幸的是:

  1. Zend_Cache_Backend_Memcached ::保存() 不检查限制是否正确&lt; 2592000

  2. memcached对象上的set()方法即使没有存储数据也会返回 $ result = @ $ this-&gt; _memcache-&gt; set($ id,array($ data,time(),$ lifetime),$ flag,$ lifetime);