ホームページ  >  記事  >  バックエンド開発  >  PHP で URL に基づいてサムネイルを自動的に生成し、同時実行性の問題を処理する方法

PHP で URL に基づいてサムネイルを自動的に生成し、同時実行性の問題を処理する方法

jacklove
jackloveオリジナル
2018-06-09 14:18:081796ブラウズ

サーバーがサムネイルを生成するタイミングは、通常、次の 2 種類に分けられます。

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 中国語 Web サイトを参照してください。

関連する推奨事項:

php 文字列圧縮方法の比較について

php タイマー ページの実行時間の監視についてクラス

##さまざまな数のパラメータをサポートする PHP コンストラクターのメソッドの紹介

#

以上がPHP で URL に基づいてサムネイルを自動的に生成し、同時実行性の問題を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。