
搭建基于 PHP 的随机图片 api
前言
我的个人博客首页顶部设置的是一个随机的大图展示,最近发现顶部大图的 API 失效了。可能是该 API 的提供者停止了项目开放共享吧,也可能其他原因。为了避免以后再次遇到类似的问题,我决定自建一个输出随机图片的 API 接口。毕竟,自己掌控的接口最为可靠。经过一番研究后,我选择了使用 PHP 项目来实现这个功能,因为 PHP 实现起来最为简单快捷。
效果展示
每次刷新首页大图都会变化,符合场景需求。
搭建操作
准备 PHP 运行环境
我服务器使用的管理面板是 1Panel(也可使用宝塔面板),搭建运行环境操作如下:
编辑执行文件
搭建好环境后,进入服务根目录。创建文本文件 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;
}
?>
请求地址
接口请求地址为: https://域名/random.php ,例如我的API地址为:https://img.dangks.online/random.php
若使用的 Halo 主题是 Theme-Joe3 则 API 配置如下图所示。
带缓存的方案
如上面的方案,每刷新一次网页请求,返回的图片就会立即变换一次,当然有可能会觉得图片刷新过于频繁,比如我想要实现 1分钟内再次请求不变化图片 的功能,于是就引入缓存机制,可以通过在服务器端存储一个缓存文件来实现这一点。具体操作如下。
在根目录创建缓存目录 cache
,然后在目录下创建文件random_image_cache.json
,json 文件内什么都不用写,接口请求时会写入缓存信息。然后使用下面的代码完全替换掉 random.php
的内容。
缓存功能代码
<?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,您可以根据个人需求选择最适合的方案进行搭建。