PHP GD 扩展提供了图像处理的接口,本文为大家介绍一款非常小巧易用的缩略图库,支持多种缩放方式、多种输出格式、自带缓存配置……

0x00 源码

首先当然是放源码:

wi1dcard/Thumb

原作者代码因为多年没有维护,我进行了大量调整和优化,暂时就不合并了。

0x01 使用

使用方法非常简单,将thumb.php复制到 Web 服务器目录下,打开此文件。文件头部提供一些可供修改的参数,包括缓存目录等。

我们在此目录下创建cache文件夹,并确保 PHP 拥有rw权限。

接下来,随便找一张图片放在此目录下,接着使用 Postman 访问:

http://<YOUR_HOST>/thumb.php?src=<IMG_SRC>&size=<Width>x<Height>

例如:

http://localhost/thumb.php?src=test.png&size=100x200

使用 Postman 是为避免客户端缓存生效。

可以发现已经成功输出缩略图,且在cache文件夹下有一条缓存文件产生。当下一次进行请求时,Thumb会自动检测客户端缓存,若存在则返回HTPP Status 304,若不存在则检测服务端缩略图缓存(cache文件夹),若已存在对应图片、缩略图参数的缓存,则直接返回缓存,不重新进行图片处理。

0x02 拓展

关于更多缩略图的参数,可参考 README 文档说明。

另外,此库单文件且内部集成缓存的方式的确让缩略图变得简单易用,但同样存在一些问题:无论图片是否已被缓存,所有的缩略图请求都会进入到 PHP 代码内进行处理,无疑会增加不必要的资源消耗。

对于请求访问量比较大的站点,还是能在 Web 服务器处理掉的请求,就直接处理掉比较好,尤其像这类静态文件,绝对是 Nginx 的强项。

你可以将请求 URL 改为图片后缀名结尾(例如:xxx.jpg),利用 Nginx 的try_files指令,尝试访问源文件,不存在再走缩略图库。

当然,如今也有 Nginx 直接实现缩略图的模块,GitHub上搜索关键词:thumb nginx。不过需要重新编译 Nginx,略显麻烦。

还有一个比较懒的办法——挂CDN,缓存全部thumb.php请求。

0x03 感言

条条大路通罗马,众多技术方案面前,实现容易,选择合适的才是难点。