Performance de Web Services com o Cache do Slim Framework

porLuis Augusto Moretto

Performance de Web Services com o Cache do Slim Framework

Quer Criar Webservices de alta performance?

Microframework Slim

Introdução

O Slim é um Micro Framework para a construção de serviços.  Extremamente simples mas ao mesmo tempo poderoso.

Com o Slim é possível criar as rotas dos serviços Web para por exemplo integração com um APP mobile. Além disso é possível criar para cada rota um Mecanismo de Cache HTTP.

A razão para fazer o “CACHEAMENTO” é que o desempenho de sites e aplicativos pode ser significativamente melhorado pela reutilização de recursos anteriormente obtidos.

Os ganhos desta estratégia tecnológica são: redução da latência e do tráfego de rede e, assim, diminuem o tempo necessário para exibir uma representação de um recurso.

Como consequência os sites e serviços ficam mais performáticos!

Ao implementar o cache o tempo e uso dos recursos da nuvem são otimizados!

Implementando o Cache

Slim 3 usa um componente opcional o Slim-HttpCache PHP para armazenamento em cache HTTP.

Você pode usar esse componente para criar e retornar respostas que contenham cabeçalhos Cache, Expires, ETag e Last-Modified que controlam quando e o tempo que a saída do aplicativo é mantida pelos caches do lado do cliente.

Talvez você precise configurar sua configuração php.ini “session.cache_limiter” para uma string vazia para que isso funcione sem interferências.

O primeiro passo para implementar é instalar a API com o composer. (Consideramos que você já tenha o Slim Framework implementado)

composer require slim/http-cache

Para inicializar o Cache em seu Webservice altere a declaração de seu objeto APP para:

$container = new \Slim\Container;
$container['cache'] = function () {
    return new \Slim\HttpCache\CacheProvider();
};
$app = new \Slim\App($container);
$app->add(new \Slim\HttpCache\Cache('public', 86400));

Feito isso o Middleware necessário para implementar a estratégia será inicializado.

Próximo passo é  definir o tempo de “Cache” no cliente para cada serviço da seguinte forma:


/**
 * @Search //Define Routes //Busca Eventos de Hoje
 */
$app->get('/busca/', function (Request $request, Response $response) use ($app) {
    //Content Type JSON Cross Domain JSON
    //Cache 24 hours
    $resWithExpires = $this->cache->withExpires($response, time() + 3600 * 24);
    $newResponse = $resWithExpires->withHeader('Content-type', 'application/json')
            ->withHeader('Access-Control-Allow-Origin', '*')
            ->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization')
            ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
    //Return Eventos for today
    $data = GuiaController::getEventosDeHoje();
    logActions("BUSCA");
    //Response Busca Hoje
    return $newResponse->withJson($data, 201);
});

Resultado

Após a ativação do Middleware do Slim Framework o tempo de resposta ficou em 14 ms. Isso ocorreu após a primeira requisição no servidor Apache 2 Mysql na Digital Ocean! Ou seja a requisição ficou armazenada localmente.

Serviço com cache tempo de resposta 14 milisegundos
Tempo de resposta: 14 milisegundos com ativação do Middleware de cache

Dicas

  • Considere usar esta estratégia em serviços os quais o conjunto de dados possa ser cacheado
  • Analise sua implementação quando o Callback tiver informações sensíveis como em uma transação.
  • O tempo de armazenamento deve ser analisado conforme cada requisito de negócio. 
  • Um exemplo se meu portal atualiza as informações a cada 24 horas posso manter os dados na maquina do cliente pelo mesmo período.

Happy Coding! 😀