Поэтому я создаю PHP-скрипт, который получает некоторые данные и предоставляет их как API. Данные не сильно меняются, но скрипт запускается каждый раз, когда его запрашивают. Есть ли способ заставить Apache кэшировать результаты этого файла, чтобы он не выполнялся каждый раз, когда кто-то его запрашивает? Важно обеспечить вывод в соответствии с параметрами URL, так что file.php?param=test1 выводит что-то другое, чем file.php?param=test2 .
Может ли Apache (особенно Apache2) сделать это, или я должен просто реализовать это в своем скрипте сам?

2 ответа2

0

Не могли бы вы поместить данные, которые не сильно меняются, в переменную родительской страницы, а затем, когда ваш скрипт вызывается, он запускает только то, что ему нужно? Обработать ваш маленький скрипт через AJAX, чтобы страница не обновлялась каждый раз?

0

Я решил это сам, создав простой PHP-скрипт для кеширования данных. Я добавлю это здесь для завершения.

<?php

    function CheckCache($request)
    {
        if(file_exists("./cache/" . escapeFileName($request)))
        {
            if ((time()-filemtime("./cache/" . escapeFileName($request)) > 12 * 3600) != true) {
                return true;
            }
        }

        return false;
    }

    function ReciveFromCache($request)
    {
        return file_get_contents("./cache/" . escapeFileName($request));
    }

    function SetCache($request, $staticContent)
    {
        $update = (array)json_decode($staticContent, true);
        $update['server']['cached'] = true;
        file_put_contents("./cache/" . escapeFileName($request), json_encode($update));
    }

    function escapeFileName($filename)
    {
        return preg_replace('/[^A-Za-z0-9_\-]/', '_', $filename);
    }
?>

Включите это в свою основную часть. Максимальный возраст кэша устанавливается в 12 * 3600 где 3600 - максимальное время в секундах (Один час = 3600 секунд * 12 = 12 часов).
Я использую это так:

function reciveFromRiot($reqURL, $urlParams = "")
{
    $api_key = "xxxx-xxxx-xxxx-xxxx";
    $request = $reqURL . "?$urlParams&api_key=" . $api_key;

    if(CheckCache($request))
    {
        $response = ReciveFromCache($request);
    }
    else
    {
        $response = file_get_contents("https://prod.api.pvp.net/api/lol/" . $request);
        $responsecode = explode(" ", $http_response_header[0])[1];

        if($responsecode != "200")
            return false;

        SetCache($request, $response);
    }

    return json_decode($response);
}

Я просто оставлю это как пример API Riot Game.
Обратите внимание, что в той же папке, где находится скрипт, должен быть кеш папок.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .