「按需生成、緩存複用」是高性能圖片服務的核心模式。本文詳解利用 Apache mod_rewrite 攔截不存在的縮略圖請求,動態調用 PHP 生成並緩存,後續請求直接由 Web Server 靜態響應的完整實現方案。
原圖路徑: /upload/news/2013/07/21/1.jpg
縮略圖路徑: /supload/news/2013/07/21/1.jpg
目錄結構:
www/
├── PicThumb.class.php # 縮略圖核心類
├── ThumbConfig.php # 尺寸/水印配置
├── upload/ # 原圖存儲
│ └── news/2013/07/21/1.jpg
├── supload/ # 縮略圖緩存目錄(需寫權限)
│ ├── .htaccess # Rewrite 規則
│ ├── watermark.png # 水印素材
│ └── createthumb.php # 生成入口腳本
<IfModule mod_rewrite.c>
RewriteEngine On
# 文件/鏈接/目錄存在時直接響應
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
# 不存在則轉發給 PHP 生成腳本
RewriteRule ^.*$ createthumb.php?path=%{REQUEST_URI} [NC,L]
</IfModule>
關鍵邏輯:優先檢查靜態文件存在性,僅在 404 時觸發動態生成,極大降低 PHP 執行頻率。
<?php
define('WWW_PATH', dirname(dirname(__FILE__)));
require WWW_PATH.'/PicThumb.class.php';
require WWW_PATH.'/ThumbConfig.php';
$logfile = WWW_PATH.'/createthumb.log';
$source_path = WWW_PATH.'/upload/';
$dest_path = WWW_PATH.'/supload/';
$path = $_GET['path'] ?? '';
if (!$path) exit();
// 解析相對路徑與類型
$relative_url = str_replace($dest_path, '', WWW_PATH.$path);
$type = substr($relative_url, 0, strpos($relative_url, '/'));
$config = $thumb_config[$type] ?? null;
if (!$config || !isset($config['fromdir'])) exit();
// 構建源/目標路徑
$source = str_replace('/'.$type.'/', '/'.$config['fromdir'].'/', $source_path.$relative_url);
$dest = $dest_path.$relative_url;
// 生成並輸出
$obj = new PicThumb($logfile);
$obj->set_config($config);
if ($obj->create_thumb($source, $dest)) {
ob_clean();
header('Content-Type: '.mime_content_type($dest));
exit(file_get_contents($dest));
}
?>
ThumbConfig.php 定義不同業務場景(news/article等)的尺寸、水印、裁剪策略sudo a2enmod rewrite && systemctl restart apache2supload/ 目錄 Web 進程可寫PicThumb.class.php 支持所需圖片格式(GD/Imagick)ThumbConfig.php 覆蓋所有業務類型此模式廣泛應用於 CMS、電商商品圖、用戶頭像等高頻縮略圖場景,是「動態生成靜態化」經典架構的教科書級實現。