CakePHP 2.1: кеш браузера и кеш просмотра - PullRequest
9 голосов
/ 16 марта 2012

У меня есть вопрос о том, как кэширование представлений и кэширование в браузере работают вместе в CakePHP 2.1.

Я только что обновил свое приложение до CakePHP 2.1 и настроил кэширование HTTP, используя новый метод $this->response->modified (который работает хорошо):

class ArticlesController extends AppController {
    public function view($id) {
        $article = $this->Article->find(
            'first',
            array('conditions' => array('Article.id' => $id))
        );

        $this->response->modified($article['Article']['modified']);

        $this->set(compact('article'));
    }
}

Я также настроил кэширование представления CakePHP:

class ArticlesController extends AppController {
    public $cacheAction = array(
        'view' => array('callbacks' => true, 'duration' => "1 week"),
    }
}

Оба работают хорошо, когда используются независимо друг от друга. Однако, когда оба включены, кэширование представлений CakePHP, кажется, переопределяет кэширование браузера (в частности, заголовок Last-Modified не отправляется, когда страницы обслуживаются из кэша представлений CakePHP). Это останавливает браузер от кэширования страниц, которые обслуживаются из кэша представления CakePHP.

В идеале я хотел бы, чтобы браузер кэшировал страницы, даже если они обслуживаются из кэша CakePHP (то есть я бы хотел, чтобы CakePHP возвращал заголовок Last-Modified и отвечал на заголовок запроса If-Modified-Since браузера, независимо от того, CakePHP возвращает кэшированную копию страницы или нет).

Мне просто интересно, является ли это ожидаемым поведением, делаю ли я что-то не так, или это что-то, что не рассматривалось (или не считается важным).

1 Ответ

2 голосов
/ 10 мая 2012

Кэширование представлений по своей природе фактически не выполняет метод контроллера при каждом запросе.Я предполагаю, что он выполняет действие один раз, а затем кэширует вывод на диск (или любой другой механизм кэширования, который вы используете).Если вы посмотрите на метод _writeFile CacheHelper , вы увидите, как создается кэшированное представление.

    $file = '<!--cachetime:' . $cacheTime . '--><?php';

    if (empty($this->_View->plugin)) {
        $file .= "
        App::uses('{$this->_View->name}Controller', 'Controller');
        ";
    } else {
        $file .= "
        App::uses('{$this->_View->plugin}AppController', '{$this->_View->plugin}.Controller');
        App::uses('{$this->_View->name}Controller', '{$this->_View->plugin}.Controller');
        ";
    }

    $file .= '
            $request = unserialize(\'' . str_replace("'", "\\'", serialize($this->request)) . '\');
            $response = new CakeResponse(array("charset" => Configure::read("App.encoding")));
            $controller = new ' . $this->_View->name . 'Controller($request, $response);
            $controller->plugin = $this->plugin = \'' . $this->_View->plugin . '\';
            $controller->helpers = $this->helpers = unserialize(base64_decode(\'' . base64_encode(serialize($this->_View->helpers)) . '\'));
            $controller->layout = $this->layout = \'' . $this->_View->layout . '\';
            $controller->theme = $this->theme = \'' . $this->_View->theme . '\';
            $controller->viewVars = unserialize(base64_decode(\'' . base64_encode(serialize($this->_View->viewVars)) . '\'));
            Router::setRequestInfo($controller->request);
            $this->request = $request;';

    if ($useCallbacks == true) {
        $file .= '
            $controller->constructClasses();
            $controller->startupProcess();';
    }

    $file .= '
            $this->viewVars = $controller->viewVars;
            $this->loadHelpers();
            extract($this->viewVars, EXTR_SKIP);
    ?>';

Создает новый объект Controller (с новым CakeResponse)и загружает все помощники, плагины и т. д., которые могут использоваться в представлении, и записывает их в кэш.

Похоже, что добавление заголовка Last-Modified к ответу действия / представления кэша может потребовать некоторого глубокогомодификации базовой библиотеки CakePHP.

...