Sakurairo原生支持了一个很好玩的功能!就是可以设定背景图片API,而该API能够提供一张随机的背景图片~
但是只用别人的API的话,就只能在提供的这些图片中随机展示了。想不想自制一个API呢?ヾ(≧▽≦*)o
自制API思路
首先观察Sakurairo原生提供的API,发现它的结尾是.php
,所以思路一下就打开了:PHP能够提供一种前后端不分离的服务,当触发请求时,经过某种机制(例如随机)选择一张图片,然后将图片作为结果进行返回。
那么思路就很简单了:
<?php
// 指定图片文件夹和访问网址前缀
$imageFolder = '/var/www/html/static/bg_img/';
$urlPrefix = 'https://www.example.com/static/bg_img/';
// 获取指定文件夹下所有图片文件
$img_array = glob("$imageFolder/*.{gif,jpg,png,webp}", GLOB_BRACE);
// 随机选择一张图片
$randomImage = $img_array[array_rand($img_array)];
// 获取图片文件名(去掉路径)
$imageName = basename($randomImage);
// 拼接完整的图片 URL
$imageUrl = $urlPrefix . $imageName;
// 重定向到图片 URL
header("Location: $imageUrl");
?>
是不是很简单(=・ω・=)
进阶
上面的代码还比较简单,还可以进阶!( σ'ω')σ
设定文件头
既然是随机图片,如果被浏览器缓存下来结果,每次都返回这个结果,那就失去随机图片的意义了。所以可以加入如下文件头,来保证服务器不缓存API的结果:
<?php
header("Access-Control-Allow-Origin: *");
header('Cache-Control: no-cache, must-revalidate');
//...
?>
需要注意这个重点:
- 这里设置的是:不缓存API的重定向结果
- 也就是不缓存这个API的返回值;
- 或者说,保证总是调用这个API,每次决定使用哪张图片是随机的;
- 换句话说,每次API返回的重定向的图片路径是随机的,因此每次都应该调用这个API;
- 这里没有设定不缓存图片本身
- 也就是可以缓存具体使用的具体图片内容;
- 或者说,在随机决定某个图片的URL后,不一定要请求该URL获取图片内容,可以使用本地的URL内容缓存;
- 换句话说,API虽然随机指定了一张图片,但这个图片以前可能访问过,因此有图片内容缓存,这个缓存是可以使用的;
这里的缓存图片本身,不是由PHP文件提供的API控制的,而是由图片静态代理等其他配置决定的。
- 比如说,自己使用了nginx代理静态图片,你在nginx中设定了webp文件缓存30天,那么这个图片本身的内容就会被浏览器缓存30天,30天再随机到这张图,就直接用本地图片;
- 比如说,你使用了别人的图床,他设定图片的缓存期是永久。那么某次API重定向到该图片后,访问该图片1次后缓存到浏览器;下次再随机到这张图,就直接用本地图片,直到浏览器清除缓存。
纠错机制
可以检查一下这个文件夹是否为空,如果为空则不返回404.
if (empty($img_array)) {
// 文件夹为空,返回 404 错误
header("HTTP/1.1 404 Not Found");
echo "404 Not Found: No images available.";
exit; // 终止脚本执行
}
传入参数
你想不想设定一个图片主题呢?例如提供:风景图片、二次元小人两种风格的图,根据参数的不同,返回指定类别下随机的图片?这个其实很好办,只需要在访问时指定参数就好了。
比如,之前访问的链接示例是:https://www.example.com/api.php
现在改成这个:https://www.example.com/api.php?type=wife
然后在php文件中进行规则判断:
$type = isset($_GET['type']) ? $_GET['type'] : null;
if ($type === 'wife') {
// ... 如果指定参数为wife
} else {
// ... 如果指定参数为其他情况
}
这样就可以根据参数的不同返回不同的图片了!此外,注意这里判断使用的是三个等号===
而不是两个等号==
,在PHP语言中,两个等号的判断要求左右两侧数据类型必须一致,所以会套一层强制类型转换,可能会导致字符串和奇怪的内容画上等号(比如字符串强制转换为0去和整数数字作比较)导致结果超出预期;而三个等号要求数据类型一致(否则返回false)。
而且Sakurairo支持给PC端和手机端分别设置图片API,用这个思路,就可以使用同一个API传入不同参数来实现双端展示不同比例的图片了!
至此,教程结束ヾ(≧▽≦*)o
Comments NOTHING