0

Zend_Cacheで保存するには、レンダリングされたすべてのコンテンツ(レイアウト+ビュー)を変数に保存する必要があります。Varnish、nginx、またはその他のソフトウェアを使用して保存することはできません。現在、私はそのようにやっています:

$view->setTemplate('application/index/index');
$viewContent = $renderer->render($view);
$view = $this->getEvent()->getViewModel();
$view->content = $viewContent;
$content = $renderer->render($view);

誰かが私にもっとエレガントな解決策を提案できますか?MbはEventManagerでネイティブレンダリングイベントをキャッチしますか、それともResponseオブジェクトまたはディスパッチイベントでいくつかのトリックをキャッチしますか?すべての提案を聞きたいです。

ありがとう!

4

1 に答える 1

1

クラスに2人のリスナーを追加しますModuleroute一致がキャッシュされたものであるかどうかの直後に、1人のリスナーが早期にチェックします。2番目のリスナーrenderは、出力を待機して取得し、キャッシュに保存します。

namespace MyModule;

use Zend\Mvc\MvcEvent;

class Module
{
    public function onBootstrap(MvcEvent $e)
    {
        // A list of routes to be cached
        $routes = array('foo/bar', 'foo/baz');

        $app = $e->getApplication();
        $em  = $app->getEventManager();
        $sm  = $app->getServiceManager();

        $em->attach(MvcEvent::EVENT_ROUTE, function($e) use ($sm) {
            $route = $e->getRouteMatch()->getMatchedRouteName();
            $cache = $sm->get('cache-service');
            $key   = 'route-cache-' . $route;

            if ($cache->hasItem($key)) {
                // Handle response
                $content  = $cache->getItem($key);

                $response = $e->getResponse();
                $response->setContent($content);

                return $response;
            }
        }, -1000); // Low, then routing has happened

        $em->attach(MvcEvent::EVENT_RENDER, function($e) use ($sm, $routes) {
            $route = $e->getRouteMatch()->getMatchedRouteName();
            if (!in_array($route, $routes)) {
                return;
            }

            $response = $e->getResponse();
            $content  = $response->getContent();

            $cache = $sm->get('cache-service');
            $key   = 'route-cache-' . $route;
            $cache->setItem($key, $content);
        }, -1000); // Late, then rendering has happened
    }
}

必ずcache-serviceサービスマネージャでキャッシュインスタンスを登録してください。上記の例を更新して、レンダリングイベント中にルートが$routes配列内にあるかどうかを確認できます。in_array($route, $routes)ここで、キャッシュにキーがあるかどうかを確認します。これは、イベント中の場合よりも遅くなる可能性がありますrender

于 2013-01-23T14:52:51.980 に答える