Защита от частых запросов к странице

316
22 января 2017, 17:34

Доброго времени суток. Есть сайт, который работает по принципу file_get_contents. (берет информацию с Web Api). Есть проблема. При быстром нажатии на F5, сайт зависает на некоторое время, т.к. наверное не справляется с нагрузками. Возможно ли как-то снизить нагрузку на страницы, где используется данная функция? Если будет много людей сидеть на сайте, то мне кажется он вообще взорвётся. Буду благодарен за помощь.

Код вывода информации: https://gist.github.com/Xhonor/f6720ec44eef783af9625dcf31d62950

Код откуда берётся информация: https://gist.github.com/Xhonor/469ba3f45d6660049d5e7e81a5a03bba

Всё работает на Steam Web Api

Answer 1

Есть такая штука, называеться network latency - время потраченое на путешествие по проводу. Это очень медленно, и чем больше расстояние тем медленнее(скорость света). Даже если сравнивать скорость доступа к localhost и рядом стояшему такому же компьютеру. Разница в скорости запроса будет до 20 мс.

Подозреваю steam хостит свои api сервера на немалом ростоянии от вашего провайдера, т.е. Каждый запрос вам будет обходиться в лучшем случае 100мс в одну сторону.

Сгонять туда обратно - 200мс(оптимистично), это для каждого! запроса к api. Простая математика говорит что более 5 запросов в секунду не проделаешь.

Поменять код что бы делать меньше запросов к api. Хранить информацию в сессии или кэше...

Кэш - memcached, redis. Эти приложения позволяют хранить данные определенное время(полчаса например).

С сессией тяжелее, самому надо будет временем управлять.

Пример:

<?php>
// Псевдо код для понимания а не копирования!!!
function getUserInfo($userId)
{
    // Пробуем читать из кэша/сессии
    $userInfo = $cache->read("user_info_" . $userId);
    // Если в кэше нет
    if (!$userInfo) {
        // Читаем с api.
        $userInfo = $api->read("user_info_" . $userId);
        // Пишем в кэш на 30 минут 
        $cache->write("user_info_" . $userId, $userInfo, 30);
    }
    // Возвращаем значение.
    return $userInfo;
}
// Пишем информацию о пользователе
function setUserInfo($userId, $userInfo) {
    // Пишем новые значения в api.
    $api->write("user_info_" . $userId, $userInfo);
    // Пишем новые значения в кэш. Важно что бы небыло старых данных
    $cache->write("user_info_" . $userId, $userInfo, 30);
}
READ ALSO
Подтянуть несколько таблиц на страницу

Подтянуть несколько таблиц на страницу

ЗдравствуйтеЕсть страница заказа, и на неё должны подтягиваться данные с нескольких таблиц БД

313
Как настроить форму обратной связи на сайте?

Как настроить форму обратной связи на сайте?

Сайт на хостинге с cPanelПочта используется с помощью biz

293