缓存带参数的单个 PHP 文件

缓存带参数的单个 PHP 文件

因此,我构建了一个 PHP 脚本,该脚本接收一些数据并将其像 API 一样提供。数据变化不大,但每次请求时脚本都会运行。有没有办法告诉 Apache 缓存此文件的结果,这样它就不会在每次有人请求时都执行?重要的是根据 URL 参数提供输出,这样file.php?param=test1输出的内容就不同了file.php?param=test2。Apache
(尤其是 Apache2)可以做到这一点吗,还是我应该自己在脚本中实现它?

答案1

您是否可以将变化不大的数据放入父页面的变量中,然后当调用脚本时,它只运行所需的内容?通过 AJAX 处理您的小脚本,这样页面就不会每次都刷新?

答案2

我自己通过构建一个简单的 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);
    }
?>

将其包含在您的主要部分中。缓存的最大期限设置为 3600,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);
}

我就把它当作一个例子Riot 游戏 API
笔记需要有一个文件夹缓存与脚本位于同一位置。

相关内容