5

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;
}

私はちょうど私のカスタムcache tagと固定を使用するようにmagentoに強制していますlifetime(memcacheはカスタムタグをサポートしていないので、これは問題ではないと思います)また、lifetimeデフォルトのタグが使用されていることがわかるため、memcachedでは使用されていません。

最初は、キャッシュ ID が長すぎるために問題が発生したと考えていましたが、それを減らした後 (<31 文字)、これは役に立ちませんでした:

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

  • この理由について何か考えはありますか?
  • どうすればデバッグできますか? ( Zend_Cache_Backend_Memcachedxdebug では下に行けません)
4

2 に答える 2

3

-vv を使用して memcached を再起動し、相互作用を確認できます。

ところで、memcache のデフォルト ポートは 11211 です。

于 2013-07-22T01:45:57.193 に答える
3

ここでの問題は $lifetime であり、Zend_Cache_Backend_Memcached の相対的なバグです。

Memcached の最大有効期間は 30 日 (2592000) であるため、使用していた制限が大きすぎたため、データが保存されませんでした。

悲しいことに:

  1. Zend_Cache_Backend_Memcached::save() は、制限が正しいかどうかをチェックしません < 2592000

  2. memcached オブジェクトの set() メソッドは、データを格納していなくても true を返します $result = @$this->_memcache->set($id, array($data, time(), $lifetime), $フラグ、$lifetime);

于 2013-07-22T07:25:00.087 に答える