首頁  >  文章  >  後端開發  >  如何讓php 根據url自動產生縮圖,並處理高並發問題

如何讓php 根據url自動產生縮圖,並處理高並發問題

jacklove
jacklove原創
2018-06-09 14:18:081796瀏覽

伺服器產生縮圖的時機一般分為兩種:

#1.上傳檔案時產生

#優點:上傳時就已經產生需要的縮圖,讀取時不需要再判斷,減少cpu運算。

缺點:當縮圖尺寸改變時或新增尺寸時,需要重新產生所有的縮圖。

2.訪問時生成

#優點:1.當有用戶訪問時才需要生成,沒有訪問的不用生成,節省空間。

           2.當修改縮圖尺寸時,只需要修改設置,而無需重新產生所有縮圖。

缺點:當縮圖不存在需要產生時,高並發存取會非常耗伺服器資源。

雖然存取時產生會有高並發問題,但其他優點都比第一種方法好,因此只要解決高並發問題就可以。

關於如何根據url自動產生縮圖的原理及實現,可以參考我之前寫的《php 根據url自動產生縮圖》。

高並發處理原理:

#1.當判斷需要產生圖片時,在tmp/目錄建立一個暫存標記文件,檔案名稱以md5(需要產生的檔案名稱)命名,處理結束後再將暫存文件刪除。

2.當判斷要產生的文件在tmp/目錄有臨時標記文件,表示文件正在處理中,則不調用生成縮圖方法,而等待,直到臨時標記文件被刪除,產生成功輸出。

修改的檔案如下,其他與之前一樣。

createthumb.php

<?php
define(&#39;WWW_PATH&#39;, dirname(dirname(__FILE__))); // 站点www目录
require(WWW_PATH.&#39;/PicThumb.class.php&#39;); // include PicThumb.class.php
require(WWW_PATH.&#39;/ThumbConfig.php&#39;);    // include ThumbConfig.php
$logfile = WWW_PATH.&#39;/createthumb.log&#39;;  // 日志文件
$source_path = WWW_PATH.&#39;/upload/&#39;;      // 原路径
$dest_path = WWW_PATH.&#39;/supload/&#39;;       // 目标路径
$path = isset($_GET[&#39;path&#39;])? $_GET[&#39;path&#39;] : &#39;&#39;;     // 访问的图片URL
// 检查path
if(!$path){
    exit();
}
// 获取图片URI
$relative_url = str_replace($dest_path, &#39;&#39;, WWW_PATH.$path);
// 获取type
$type = substr($relative_url, 0, strpos($relative_url, &#39;/&#39;));
// 获取config
$config = isset($thumb_config[$type])? $thumb_config[$type] : &#39;&#39;;
// 检查config
if(!$config || !isset($config[&#39;fromdir&#39;])){
    exit();
}
// 原图文件
$source = str_replace(&#39;/&#39;.$type.&#39;/&#39;, &#39;/&#39;.$config[&#39;fromdir&#39;].&#39;/&#39;, $source_path.$relative_url);
// 目标文件 
$dest = $dest_path.$relative_url;
if(!file_exists($source)){ // 原图不存在
    exit();
}
// 高并发处理
$processing_flag = &#39;/tmp/thumb_&#39;.md5($dest); // 用于判断文件是否处理中
$is_wait = 0;                                // 是否需要等待
$wait_timeout = 5;                           // 等待超时时间
if(!file_exists($processing_flag)){
    file_put_contents($processing_flag, 1, true);
}else{
    $is_wait = 1;
}
if($is_wait){ // 需要等待生成
    while(file_exists($processing_flag)){
        if(time()-$starttime>$wait_timeout){ // 超时
            exit();
        }
        usleep(300000); // sleep 300 ms
    }
    if(file_exists($dest)){ // 图片生成成功
        ob_clean();
        header(&#39;content-type:&#39;.mime_content_type($dest));
        exit(file_get_contents($dest));
    }else{
        exit(); // 生成失败退出
    }
}
// 创建缩略图
$obj = new PicThumb($logfile);
$obj->set_config($config);
$create_flag = $obj->create_thumb($source, $dest);
unlink($processing_flag); // 删除处理中标记文件
if($create_flag){ // 判断是否生成成功
    ob_clean();
    header(&#39;content-type:&#39;.mime_content_type($dest));
    exit(file_get_contents($dest));
}
?>

本篇文章講解如何讓php 根據url自動產生縮圖,並處理高並發問題,更多相關問題請關注php中文網。

相關建議:

關於php 字串壓縮方法之間的比較

關於php Timer 頁面執行時間監測類別的相關介紹

關於php 建構子支援不同個數字參數的方法介紹

#

以上是如何讓php 根據url自動產生縮圖,並處理高並發問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn