ホームページ >バックエンド開発 >PHPチュートリアル >PHP は URL に基づいてサムネイルを自動的に生成し、同時実行性の問題を処理します
サーバーがサムネイルを生成するタイミングは、一般に次の 2 つのタイプに分けられます:
1. ファイルのアップロード時に生成されます
利点: 必要なサムネイルはすでに生成されていますアップロード時、読み込み時の判定が不要となり、CPU負荷が軽減されます。
欠点: サムネイルのサイズが変更されるか、新しいサイズが追加されると、すべてのサムネイルを再生成する必要があります。
2. アクセス時に生成
利点: 1. アクセスしているユーザーがいる場合にのみ生成する必要があり、アクセスしているユーザーがいる場合は生成する必要はありませんアクセスが不要なので、スペースを節約できます。
2. サムネイルのサイズを変更する場合、すべてのサムネイルを再生成することなく、設定を変更するだけで済みます。
短所: サムネイルが存在せず、サムネイルを生成する必要がある場合、同時アクセスが多くなるとサーバー リソースが大量に消費されます。
アクセス時に同時実行性が高い問題が発生しますが、他の利点は最初の方法よりも優れているため、同時実行性が高い問題のみを解決する必要があります。
URLに基づいてサムネイルを自動生成する原理と実装については、以前書いた「phpがURLに基づいてサムネイルを自動生成する」を参照してください。
高同時実行処理原則:
1. 画像を生成する必要があると判断された場合、tmp/ディレクトリに一時マークファイルを作成し、そのファイルをname は 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 中国語 Web サイト (www.php.cn) にご注意ください。