Files
yii2/docs/guide-pt-BR/caching-http.md
cuiliang cd9caf65d2 20160611
2016-06-11 19:49:57 +08:00

12 KiB

Cache HTTP

<<<<<<< HEAD Além do cache no servidor que nós descrevemos nas seções anteriores, aplicações web pode também aproveitar-se de cache no cliente para economizar o tempo para gerar e transmitir o mesmo conteúdo de uma página.

Para usar o cache no cliente, vocế poderá configurar [[yii\filters\HttpCache] como um filtro para actions de um controller ao qual o resultado de sua renderização possa ser armazenado em cache no navegador do cliente. yii\filters\HttpCache funciona apenas para requisições GET e HEAD. Ele pode manipular três tipos de cache relacionados a cabeçalhos HTTP para estas requisições:

Além do cache no servidor que nós descrevemos nas seções anteriores, aplicações Web pode também aproveitar-se de cache no cliente para economizar o tempo na montagem e transmissão do mesmo conteúdo de uma página.

Para usar o cache no cliente, você poderá configurar yii\filters\HttpCache como um filtro de ações de um controller ao qual o resultado de sua renderização possa ser armazenado em cache no navegador do cliente. A classe yii\filters\HttpCache funciona apenas para requisições GET e HEAD. Ele pode manipular três tipos de cache relacionados a cabeçalhos HTTP para estas requisições:

master

<<<<<<< HEAD

Cabeçalho de Last-modified

O cabeçalho Last-modified usa uma data(timestamp) para indicar se a página foi modificada desde que o cliente a armazenou em cache.

Você pode configurar a propriedade yii\filters\HttpCache::lastModified para permitir enviar o cabeçalho de Last-modified. A propriedade deve ser um callable PHP retornando uma data(timestamp) UNIX sobre o tempo de modificação. A declaração do callable PHP deve ser a seguinte,

/**
 * @param Action $action O Objeto da action que está sendo manipulada no momento
=======
## Cabeçalho `Last-modified` <span id="last-modified"></span>

O cabeçalho `Last-modified` usa uma data (timestamp) para indicar se a página foi modificada desde que o cliente a armazenou em cache.

Você pode configurar a propriedade [[yii\filters\HttpCache::lastModified]] para permitir enviar o cabeçalho `Last-modified`. A propriedade deve ser um PHP *callable* retornando uma data (UNIX timestamp) sobre o tempo de modificação. A declaração do PHP *callable* deve ser a seguinte,

```php
/**
 * @param Action $action O Objeto da ação que está sendo manipulada no momento
>>>>>>> master
 * @param array $params o valor da propriedade "params"
 * @return integer uma data(timestamp) UNIX timestamp representando o tempo da 
 * última modificação na página
 */
function ($action, $params)

A seguir um exemplo que faz o uso do cabeçalho Last-modified:

public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\HttpCache',
            'only' => ['index'],
            'lastModified' => function ($action, $params) {
                $q = new \yii\db\Query();
                return $q->from('post')->max('updated_at');
            },
        ],
    ];
}

<<<<<<< HEAD O código acima afirma que o cache HTTP deve ser habilitado apenas para a action index. Este deve gerar um cabeçalho HTTP last-modified baseado na última data de alteração dos posts. Quando um navegador visitar a página index pela primeira vez, a página irá ser gerada no servidor e enviada para o navegador; Se o navegador visitar a mesma página novamente e não houver modificação dos posts durante este período, o servidor não irá re-gerar a página, e o navegador irá usar a versão em cache no cliente. Como um resultado a renderização do conteúdo na página não será executada no servidor.

O código acima afirma que o cache HTTP deve ser habilitado apenas para a ação index. Este deve gerar um cabeçalho HTTP last-modified baseado na última data de alteração dosposts. Quando um navegador visitar a página index pela primeira vez, a página será gerada no servidor e enviada para o navegador; Se o navegador visitar a mesma página novamente e não houver modificação dos posts durante este período, o servidor não irá remontará a página e o navegador usará a versão em cache no cliente. Como resultado, a renderização do conteúdo na página não será executada no servidor.

master

Cabeçalho ETag

<<<<<<< HEAD O cabeçalho "Entity Tag" (ou ETag abreviado) usa um hash para representar o conteúdo de uma página. Se a página for alterada, o hash irá mudar também. Ao comparar o hash mantido no cliente com o hash gerado no servidor, o cache pode determinar se a página foi alterada e se deve ser re-transmitida.

Você pode configurar a propriedade yii\filters\HttpCache::etagSeed para habilitar o envio do cabeçalho ETag. A propriedade deve ser um callable PHP retornando a semente(seed) para a geração do hash do Etag. A declaração do callable PHP deve ser como a seguinte,

/**
 * @param Action $action o objeto da action que está sendo manipulada no momento
 * @param array $params o valor da propriedade "params"
 * @return string uma string usada como a semente(seed) para gerar um hash ETag
=======
O cabeçalho *"Entity Tag"* (ou `ETag` abreviado) usa um hash para representar o conteúdo de uma página.
Se a página for alterada, o hash irá mudar também. Ao comparar o hash mantido no cliente com o hash gerado no
servidor, o cache pode determinar se a página foi alterada e se deve ser retransmitida.

Você pode configurar a propriedade [[yii\filters\HttpCache::etagSeed]] para habilitar o envio do cabeçalho `ETag`.
A propriedade deve ser um PHP *callable* retornando um conteúdo ou dados serializados (chamado também de *seed* na referência americana) para a geração do hash do Etag. A declaração do PHP *callable* deve ser como a seguinte,

```php
/**
 * @param Action $action o objeto da ação que está sendo manipulada no momento
 * @param array $params o valor da propriedade "params"
 * @return string uma string usada como um conteúdo para gerar o hash ETag
>>>>>>> master
 */
function ($action, $params)

<<<<<<< HEAD A Seguir um exemplo que faz o uso do cabeçalho ETag:

A seguir um exemplo que faz o uso do cabeçalho ETag:

master

public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\HttpCache',
            'only' => ['view'],
            'etagSeed' => function ($action, $params) {
                $post = $this->findModel(\Yii::$app->request->get('id'));
                return serialize([$post->title, $post->content]);
            },
        ],
    ];
}

<<<<<<< HEAD O código acima afirma que o cache de HTTP deve ser habilitado apenas para a action view. Este deve gerar um cabeçalho HTTP ETag baseado no titulo e conteúdo do post requisitado. Quando um navegador visitar a página view pela primeira vez, a página será gerada no servidor e enviada para ele; Se o navegador visitar a mesma página novamente e não houver alteração para o título e o conteúdo do post, o servidor não irá ré-gerar a página, e o navegador irá usar a versão que estiver no cache do cliente. Como um resultado a renderização do

O código acima afirma que o cache de HTTP deve ser habilitado apenas para a ação view. Este deve gerar um cabeçalho HTTP ETag baseado no título e no conteúdo do post requisitado. Quando um navegador visitar a página view pela primeira vez, a página será gerada no servidor e enviada para ele; Se o navegador visitar a mesma página novamente e não houver alteração para o título e o conteúdo do post, o servidor não remontará a página e o navegador usará a versão que estiver no cache do cliente. Como resultado, a renderização do

master conteúdo na página não será executada no servidor.

ETags permite estratégias mais complexas e/ou mais precisas do que o uso do cabeçalho de Last-modified. Por exemplo, um ETag pode ser invalidado se o site tiver sido alterado para um novo tema.

<<<<<<< HEAD Gerações muito complexas de ETags podem contrariar o propósito de se usar HttpCache e introduzir despesas desnecessárias ao processamento, já que eles precisam ser re-avaliados a cada requisição. Tente encontrar uma expressão simples que invalida o cache se o conteúdo da página for modificado.

Observação: Em complacência com a RFC 7232, HttpCache irá enviar os cabeçalhos ETag e Last-Modified se ambos forem assim configurados. E se o cliente envia ambos o cabeçalhos If-None-Match e If-Modified-Since, apenas o primeiro será ======= Gerações muito complexas de ETags podem contrariar o propósito de se usar HttpCache e introduzir despesas desnecessárias ao processamento, já que eles precisam ser reavaliados a cada requisição. Tente encontrar uma expressão simples que invalida o cache se o conteúdo da página for modificado.

Observação: Em concordância com a RFC 7232, o HttpCache enviará os cabeçalhos ETag e Last-Modified se ambos forem assim configurados. E se o cliente enviar ambos o cabeçalhos If-None-Match e If-Modified-Since, apenas o primeiro será

master respeitado.

Cabeçalho Cache-Control

<<<<<<< HEAD O cabeçalho Cache-Control especifica politicas de cache gerais para as páginas. Você pode enviá-lo configurando a propriedade yii\filters\HttpCache::cacheControlHeader com o valor do cabeçalho. Por padrão, o seguinte cabeçalho será enviado:

O cabeçalho Cache-Control especifica políticas de cache gerais para as páginas. Você pode enviá-lo configurando a propriedade yii\filters\HttpCache::cacheControlHeader com o valor do cabeçalho. Por padrão, o seguinte cabeçalho será enviado:

master

Cache-Control: public, max-age=3600

<<<<<<< HEAD

Limitador de Cache na Sessão

Quando uma página usa sessão, o PHP irá automaticamente enviar alguns cabeçalhos HTTP relacionados ao cache como especificado na configuração do PHP INI session.cache_limiter. Estes cabeçalhos podem inteferirir ou desabilitar o cache que você deseja do HttpCache. Para previnir-se deste problema, por padrão HttpCache irá desabilitar o envio destes cabeçalhos automaticamente. Se você quiser modificar estes comportamente, deve configurara a propriedade yii\filters\HttpCache::sessionCacheLimiter. A propriedade pode receber um valor em uma string, incluindo public, private, private_no_expire, e nocache. Por favor referir-se ao manual do PHP sobre session_cache_limiter() para explicações sobre estes valores.

Limitador de Cache na Sessão

Quando uma página usa sessão, o PHP automaticamente enviará alguns cabeçalhos HTTP relacionados ao cache como especificado na configuração session.cache_limiter do PHP.INI. Estes cabeçalhos podem interferir ou desabilitar o cache que você deseja do HttpCache. Para prevenir-se deste problema, por padrão, o HttpCache desabilitará o envio destes cabeçalhos automaticamente. Se você quiser modificar estes comportamentos, deve configurar a propriedade yii\filters\HttpCache::sessionCacheLimiter. A propriedade pode receber um valor string, como: public, private, private_no_expire e nocache. Por favor, consulte o manual do PHP sobre session_cache_limiter() para mais explicações sobre estes valores.

master

Implicações para SEO

<<<<<<< HEAD Os bots do motor de buscas tendem a respeitar cabeçalhos de cache. Ja que alguns rastreadores têm um limite sobre a quantidade de páginas por dominio que eles processam em um certo espaço de tempo, introduzir cabeçalhos de cache podem

Os bots do motor de buscas tendem a respeitar cabeçalhos de cache. Já que alguns rastreadores têm um limite sobre a quantidade de páginas por domínio que eles processam em um certo espaço de tempo, introduzir cabeçalhos de cache podem

master ajudar na indexação do seu site já que eles reduzem o número de páginas que precisam ser processadas.