伺服器產生縮圖的時機一般分為兩種:
#1.上傳檔案時產生
#優點:上傳時就已經產生需要的縮圖,讀取時不需要再判斷,減少cpu運算。
缺點:當縮圖尺寸改變時或新增尺寸時,需要重新產生所有的縮圖。
2.訪問時生成
#優點:1.當有用戶訪問時才需要生成,沒有訪問的不用生成,節省空間。
2.當修改縮圖尺寸時,只需要修改設置,而無需重新產生所有縮圖。
缺點:當縮圖不存在需要產生時,高並發存取會非常耗伺服器資源。
雖然存取時產生會有高並發問題,但其他優點都比第一種方法好,因此只要解決高並發問題就可以。
關於如何根據url自動產生縮圖的原理及實現,可以參考我之前寫的《php 根據url自動產生縮圖》。
高並發處理原理:
#1.當判斷需要產生圖片時,在tmp/目錄建立一個暫存標記文件,檔案名稱以md5(需要產生的檔案名稱)命名,處理結束後再將暫存文件刪除。
2.當判斷要產生的文件在tmp/目錄有臨時標記文件,表示文件正在處理中,則不調用生成縮圖方法,而等待,直到臨時標記文件被刪除,產生成功輸出。
修改的檔案如下,其他與之前一樣。
createthumb.php
<?php define('WWW_PATH', dirname(dirname(__FILE__))); // 站点www目录 require(WWW_PATH.'/PicThumb.class.php'); // include PicThumb.class.php require(WWW_PATH.'/ThumbConfig.php'); // include ThumbConfig.php $logfile = WWW_PATH.'/createthumb.log'; // 日志文件 $source_path = WWW_PATH.'/upload/'; // 原路径 $dest_path = WWW_PATH.'/supload/'; // 目标路径 $path = isset($_GET['path'])? $_GET['path'] : ''; // 访问的图片URL // 检查path if(!$path){ exit(); } // 获取图片URI $relative_url = str_replace($dest_path, '', WWW_PATH.$path); // 获取type $type = substr($relative_url, 0, strpos($relative_url, '/')); // 获取config $config = isset($thumb_config[$type])? $thumb_config[$type] : ''; // 检查config if(!$config || !isset($config['fromdir'])){ exit(); } // 原图文件 $source = str_replace('/'.$type.'/', '/'.$config['fromdir'].'/', $source_path.$relative_url); // 目标文件 $dest = $dest_path.$relative_url; if(!file_exists($source)){ // 原图不存在 exit(); } // 高并发处理 $processing_flag = '/tmp/thumb_'.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('content-type:'.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('content-type:'.mime_content_type($dest)); exit(file_get_contents($dest)); } ?>
本篇文章講解如何讓php 根據url自動產生縮圖,並處理高並發問題,更多相關問題請關注php中文網。
相關建議:
#以上是如何讓php 根據url自動產生縮圖,並處理高並發問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!