サーバーがサムネイルを生成するタイミングは、通常、次の 2 種類に分けられます。
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 中国語 Web サイトの他の関連記事を参照してください。