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

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

黄舟
黄舟オリジナル
2017-02-17 10:18:10971ブラウズ

サーバーがサムネイルを生成するタイミングは、一般に次の 2 つのタイプに分けられます:


1. ファイルのアップロード時に生成されます

利点: 必要なサムネイルはすでに生成されていますアップロード時、読み込み時の判定が不要となり、CPU負荷が軽減されます。

欠点: サムネイルのサイズが変更されるか、新しいサイズが追加されると、すべてのサムネイルを再生成する必要があります。


2. アクセス時に生成

利点: 1. アクセスしているユーザーがいる場合にのみ生成する必要があり、アクセスしているユーザーがいる場合は生成する必要はありませんアクセスが不要なので、スペースを節約できます。

2. サムネイルのサイズを変更する場合、すべてのサムネイルを再生成することなく、設定を変更するだけで済みます。

短所: サムネイルが存在せず、サムネイルを生成する必要がある場合、同時アクセスが多くなるとサーバー リソースが大量に消費されます。

アクセス時に同時実行性が高い問題が発生しますが、他の利点は最初の方法よりも優れているため、同時実行性が高い問題のみを解決する必要があります。


URLに基​​づいてサムネイルを自動生成する原理と実装については、以前書いた「phpがURLに基​​づいてサムネイルを自動生成する」を参照してください。


高同時実行処理原則:

1. 画像を生成する必要があると判断された場合、tmp/ディレクトリに一時マークファイルを作成し、そのファイルをname は 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 中国語 Web サイト (www.php.cn) にご注意ください。



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