首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 訪問時動態生成縮略圖與高並發解決方案

     編輯:PHP 綜合知識

兩種縮略圖生成策略對比

策略一:上傳時生成

優點: 讀取時無需判斷,減少 CPU 運算,響應極快。

缺點: 尺寸變更或新增規則時,需批量重新生成歷史圖片,維護成本高。

策略二:訪問時生成(推薦)

優點:

  • 按需生成,未訪問不佔空間
  • 尺寸調整只需修改配置,無需重刷存量

缺點: 高並發下首次生成會造成資源競爭。

高並發核心解決思路:臨時標記文件鎖

實現原理

  1. 判斷縮略圖不存在,需生成時
  2. 在 tmp/ 目錄創建標記文件,文件名為 md5(目標文件路徑)
  3. 若文件已存在,說明有進程正在生成,當前進程等待或直接返回佔位圖
  4. 生成完成後刪除標記文件,釋放鎖

偽代碼示例

<?php
function generateThumb($srcPath, $dstPath, $width, $height) {
    $lockFile = sys_get_temp_dir() . '/thumb_lock_' . md5($dstPath);
    
    // 嘗試獲取鎖(非阻塞)
    $fp = @fopen($lockFile, 'x');
    if (!$fp) {
        // 正在生成中,返回佔位圖或等待
        return getPlaceholder();
    }
    
    try {
        // 實際生成邏輯
        $image = imagecreatefromjpeg($srcPath);
        $thumb = imagescale($image, $width, $height);
        imagejpeg($thumb, $dstPath);
        imagedestroy($image);
        imagedestroy($thumb);
    } finally {
        fclose($fp);
        @unlink($lockFile); // 釋放鎖
    }
    
    return $dstPath;
}
?>

補充優化建議

  • 使用 flock() 實現進程級阻塞等待
  • 配合 Nginx try_files 指令,無縫轉發至 PHP 生成腳本
  • 生成完成後發送 X-Accel-Redirect 讓 Nginx 直接服務靜態文件

採用「訪問時生成 + 文件鎖」方案,兼顧靈活性與高併發穩定性,是生產環境首選架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved