[PHP] 应对API失效: 自建随机图片接口的解决方案

前言

我的个人博客首页顶部设置的是一个随机的大图展示,最近发现顶部大图的 API 失效了。可能是该 API 的提供者停止了项目开放共享吧,也可能其他原因。为了避免以后再次遇到类似的问题,我决定自建一个输出随机图片的 API 接口。毕竟,自己掌控的接口最为可靠。经过一番研究后,我选择了使用 PHP 项目来实现这个功能,因为 PHP 实现起来最为简单快捷。

效果展示

每次刷新首页大图都会变化,符合场景需求。

搭建操作

1. 搭建PHP运行环境

我服务器使用的管理面板是1Panel,搭建运行环境操作如下:

2. 编辑执行文件

搭建好环境后,进入服务根目录。创建文本文件"img.txt"里面填写图片来源URL(图片可以来自图床,如果没有图床也可以将图片上传博客的附件库;或者更为直接的将需要的图片上传到根目录,文本中填写相对路径读取图片),修改"index.php""random.php",默认内容全部替换为我们的脚本代码。

“img.txt”内容示例:

“random.php”中写入以下代码:

<?php
// 存有image链接的文件名
$filename = "img.txt";

// 检查文件是否存在
if (!file_exists($filename)) {
    http_response_code(404);
    header('Content-Type: application/json');
    echo json_encode(['error' => '文件不存在']);
    exit;
}

// 从文本文件中读取链接
$pics = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

// 检查是否读取到了图片链接
if (empty($pics)) {
    http_response_code(404);
    header('Content-Type: application/json');
    echo json_encode(['error' => '没有找到图片链接']);
    exit;
}

// 从数组中随机选择一个链接
$pic = $pics[array_rand($pics)];

// 根据请求参数返回指定格式
$type = isset($_GET['type']) ? $_GET['type'] : '';

switch ($type) {
    case 'json':
        header('Content-Type: application/json');
        echo json_encode(['pic' => $pic]);
        break;

    default:
        header("Location: $pic");
        exit;
}
?>

请求地址

接口请求地址为“Web访问域名”+“/random.php”,例如我的API地址“https://img.dangks.online/random.php

若使用的Halo主题是Theme-Joe3则API配置如下图所示。


带缓存的方案

如上面的方案,每刷新一次网页请求,返回的图片就会立即变换一次,当然有可能会觉得图片刷新过于频繁,比如我想要实现“1分钟内再次请求不变化图片”的功能,于是就引入缓存机制,可以通过在服务器端存储一个缓存文件来实现这一点。具体操作如下。

1. 增加缓存文件

在根目录创建缓存目录cache,然后在目录下创建文件random_image_cache.json,json文件内什么都不要用写,接口请求时会写入缓存信息。然后使用下面的代码完全替换掉random.php的内容。

2. 缓存功能代码
<?php
// 存有image链接的文件名
$filename = "img.txt";
$cache_file = 'cache/random_image_cache.json';

// 检查文件是否存在
if (!file_exists($filename)) {
    http_response_code(404);
    header('Content-Type: application/json');
    echo json_encode(['error' => '文件不存在']);
    exit;
}

// 从文本文件中读取链接
$pics = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

// 检查是否读取到了图片链接
if (empty($pics)) {
    http_response_code(404);
    header('Content-Type: application/json');
    echo json_encode(['error' => '没有找到图片链接']);
    exit;
}

// 检查缓存文件是否存在并且没有过期
$cache_duration = 60; // 缓存持续时间为1分钟
$cache_is_valid = false;
$pic = null;

if (file_exists($cache_file)) {
    $cache_time = filemtime($cache_file);
    if (time() - $cache_time < $cache_duration) {
        $cache_is_valid = true;
        $cache_data = json_decode(file_get_contents($cache_file), true);
        $pic = $cache_data['pic'];
    }
}

// 如果缓存有效,直接使用缓存中的图片链接
if (!$cache_is_valid) {
    // 从数组中随机选择一个链接
    $pic = $pics[array_rand($pics)];

    // 将新的图片链接和当前时间保存到缓存文件中
    $cache_data = [
        'pic' => $pic,
        'time' => time()
    ];
    file_put_contents($cache_file, json_encode($cache_data));
}

// 根据请求参数返回指定格式
$type = isset($_GET['type']) ? $_GET['type'] : '';

switch ($type) {
    case 'json':
        header('Content-Type: application/json');
        echo json_encode(['pic' => $pic]);
        break;

    default:
        header("Location: $pic");
        exit;
}
?>

总结

通过以上的解决方案,我成功实现了具备两种效果的随机图片API,您可以根据个人需求选择最适合的方案进行搭建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值