3

この記事で概説されているように、コード/ディレクトリ/構成をセットアップしました: http://www.jasonggrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/

したがって、私の設定ファイルは次のようになります。

<?php
namespace Game;

return array(

    // <snip>

    // Doctrine config
    'doctrine' => array(
        'driver' => array(
            __NAMESPACE__ . '_driver' => array(
                'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                'cache' => 'array',
                'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
            ),
            'orm_default' => array(
                'drivers' => array(
                    __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
                )
            )
        )
    ),
);

では、Doctrine が Memcached をキャッシング バックエンドとして使用するようにするには、何を設定/変更する必要がありますか? 私はGoogleでたくさん検索しましたが、この質問以外では、彼らがそれを機能させたと言っていますが(方法ではありません)、何も見つけることができませんでした.

4

5 に答える 5

6

前の答えを忘れてください。エラーの追跡に何時間も費やした後、doctrineが「doctrine.cache.instance」を検索することがわかりました。値は、サービスマネージャーで設定したサービスを参照する文字列である必要があります。

ただし、Doctrineコードベースのバグのため、構成が取得されることはありません。これは後でgithubに送信します。

ただし、「doctrine.cache.instance」が指定されていない場合は、エイリアス「my_memcached_alias」が使用されます。

したがって、上記のコードは簡単に修正でき、厄介なハックは教義のソースから削除されます。

:将来の互換性とインスタンスエイリアスを設定する適切な方法を示すために、doctrine.cache構成を残しました)

module.config.php

    'doctrine' => array(
            'driver' => array(
                __NAMESPACE__ . '_driver' => array(
                    'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                    'cache' => 'memcached',
                    'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity'),
                ),
                'orm_default' => array(
                    'drivers' => array(
                        __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver',
                    ),
                ),
            ),
            'cache' => array(
                'instance' => 'my_memcached_alias',
            ),
        ),

    'service_manager' => array(
            'factories' => array(
                'my_memcached_alias' => function() {
                    $memcached = new \Memcached();
                    $memcached->addServer('localhost', 11211);
                    return $memcached;
                },
            ),
         ),

フレームワークの変更を伴わない解決策をすでに見つけていることを願っていますが、まだ答えを探しているすべての人にとって、これは間違いなく役立ちます

編集:多くの頭痛の種の後、私はこの設定がdoctrine.cache.memcache.instanceであるべきだとわかりました

2番目の編集:

これが正しいコードです

'cache' => array(
        'memcache' => array(
            'instance' => 'memcacheService',
        ),
    ),
于 2012-12-03T09:55:20.783 に答える
3

Doctrine ORM モジュール自体を変更する必要があったため、一時的な回避策しかありません。

まず、上記の設定でキャッシュを memcache:'cache' => 'array','cache' => 'memcache',設定します。

次に、サービス ファクトリを定義して memcache インスタンスを作成します。モジュールクラスでこれを行うことができます:

注:この例は、memcacheDではなくmemcacheに基づいています。しかし、 memcachedについても同じはずです。

function getServiceConfig()
{
    return array(
        'factories' => array(
            'memcache' => function(ServiceManager $sm) {
                $memcache = new \Memcache(); // .. do some configuration and connect
                return $memcache;
            } 
        )
    );
}

最後のステップは、Doctrine ORM モジュールを変更することです。そうしないと、インスタンスが作成されず、エラーがスローされます。

DoctrineModule/Service/CacheFactory.php l61

$cache->setMemcache($options->getInstance());

なる:

$cache->setMemcache($sl->get($options->getInstance()));

(あなたの場合、これを 64 行目で行います。) または、memcached インスタンスを に注入する別の方法を見つけます$options。これは回避策にすぎず、できるだけ早く修正する必要があることに注意してください。そうしないと、モジュールの更新に問題が発生します。

お役に立てれば。

于 2012-09-18T07:27:24.447 に答える
0

まず、memcached php 拡張機能をインストールします。

~ # > aptitude install php5-memcached

その後、memcached サーバーのパラメーターを構成する必要があります。

//app/config/parameters.yml
parameters:
    ...
    memcache_hosts:
        -
            dsn: 127.0.0.1
            port: 11211

次に、いくつかのサービスを作成する必要があります

services:
    memcached:
        class: Memcached
        calls:
            - [ addServers, [%memcache_hosts%] ]

    doctrine.cache.memcached:
        class: Doctrine\Common\Cache\MemcachedCache
        calls:
            - [ setMemcached, [ @memcached ] ]

その後、config.yml に構成を追加する必要があります。

//app/config/config.yml

...
doctrine:
    ...
    orm:
        entity_managers:
            default:
               ...    
               metadata_cache_driver:
                    type: service
                    id: doctrine.cache.memcached
                query_cache_driver:
                    type: service
                    id: doctrine.cache.memcached
                result_cache_driver:
                    type: service
                    id: doctrine.cache.memcached

これで、Doctrine Doc で説明されているように、Memcached を使用してクエリをキャッシュできます。

また、doctrine キャッシュをクリアするための 3 つの symfony コマンドがあります。

$> php app/console doctrine:cache:clear-metadata 
                 //Clears all metadata cache for an entity manager

$> php app/console doctrine:cache:clear-query 
                 //Clears all query cache for an entity manager

$> doctrine:cache:clear-result 
                 //Clears result cache for an entity manager

これらの手順を次から抽出しました。

https://blog.42mate.com/implementing-doctrine-caching-with-memcached-in-symfony-2/

于 2016-08-28T09:12:16.147 に答える