Вопрос по rest, api, caching, symfony – Как правильно кэшировать мои API Symfony2?

6

Я делаю классические API RESTfull без сохранения состояния на Symfony2: пользователи / приложения получают токен аутентификации на API аутентификации и дают его всем другим API для регистрации и публикации данных / доступа, защищенных / личных / личных данных, на других API.

Теперь у меня есть три проблемы, связанные с этим рабочим процессом и кэшированием:

How to use HTTP cache for my 'static' APIs (that always deliver the same content, regardless the logged user and its token) assuming that different tokens would be passed in the url by different users for the same API, so that the url would never be the same? How to use HTTP shared cache then?

I've got APIs for the same url that produce a different output, regarding the logged user rights (I've basically 4 different rights levels). Question is: is it a good pattern? It is not better to have 4 different urls, one for each right, that I could cache? If not, how to implement a proper cache on that?

Is shared HTTP Cache working on HTTPS? If not, which type of caching should I implement, and how?

Спасибо за ваши ответы и свет на это.

Ваш Ответ

1   ответ
8

и я успешно использовал следующую стратегию со встроенным кешем обратного прокси-сервера Symfony:

If using Apache, update .htaccess to add an environment variable for your application to the http cache off of (NOTE: environment automatically adds REDIRECT_ to the environment variable):

# Add `REDIRECT_CACHE` if API subdomain
RewriteCond %{HTTP_HOST} ^api\.
RewriteRule .* - [E=CACHE:1]

# Add `REDIRECT_CACHE` if API subfolder
RewriteRule ^api(.*)$ - [E=CACHE:1]

Add this to app.php after instantiating AppKernel:

// If environment instructs us to use cache, enable it
if (getenv('CACHE') || getenv('REDIRECT_CACHE')) {
    require_once __DIR__.'/../app/AppCache.php';

    $kernel = new AppCache($kernel);
}

For your "static" APIs, all you have to do is take your response object and modify it:

$response->setPublic();
$response->setSharedMaxAge(6 * 60 * 60);

Because you have a session, user or security token, Symfony effectively defaults to $response->setPrivate().

Что касается вашего второго пункта, соглашений REST (а также рекомендаций обратного прокси-сервера), GET & amp; Запросы HEAD не предназначены для изменения между запросами. Из-за этого, если содержимое изменяется в зависимости от пользователя, вошедшего в систему, вы должны установить ответ как частный & amp; вообще запретить кеширование для кеша обратного прокси.

If caching is required for speed, it should be handled internally & not by the reverse-proxy.

Поскольку мы не хотели вводить URL-адреса на основе каждой роли пользователя, мы просто кэшировали ответ по ролям внутри себя (используя Redis) & amp; вернул его напрямую, а не позволял кешу (ошибкам) его обрабатывать

Что касается вашего третьего пункта, потому что HTTP & amp; HTTPS-трафик попадает в тот же кеш и ответы имеют общедоступные / частные & amp; Настройки контроля кеша явно установлены,AppCache обслуживает один и тот же ответ как безопасный & amp; небезопасное движение.

Я надеюсь, что это помогает так же, как и для меня!

Похожие вопросы