Heim  >  Artikel  >  Backend-Entwicklung  >  PHP generiert automatisch Miniaturansichten basierend auf URLs und behebt Probleme mit hoher Parallelität

PHP generiert automatisch Miniaturansichten basierend auf URLs und behebt Probleme mit hoher Parallelität

黄舟
黄舟Original
2017-02-17 10:18:10971Durchsuche

Der Zeitpunkt, zu dem der Server Miniaturansichten generiert, wird im Allgemeinen in zwei Typen unterteilt:


1. Beim Hochladen einer Datei generieren

Vorteile: Die erforderlichen Miniaturansichten werden bereits beim Hochladen generiert und sind nicht erforderlich Um beim Lesen zu beurteilen, reduzieren Sie den CPU-Betrieb.

Nachteile: Wenn sich die Größe der Miniaturansichten ändert oder eine neue Größe hinzugefügt wird, müssen alle Miniaturansichten neu generiert werden.


2. Beim Zugriff auf

generieren

Vorteile: 1. Es muss nur generiert werden, wenn ein Benutzer darauf zugreift. Wenn kein Zugriff besteht, muss es nicht generiert werden, was Platz spart.

2. Wenn Sie die Größe der Miniaturansichten ändern, müssen Sie nur die Einstellungen ändern, ohne alle Miniaturansichten neu zu generieren.

Nachteile: Wenn keine Miniaturansichten vorhanden sind und generiert werden müssen, verbraucht ein hoher gleichzeitiger Zugriff viele Serverressourcen.

Obwohl beim Zugriff Probleme mit hoher Parallelität auftreten, sind andere Vorteile besser als bei der ersten Methode, sodass Sie nur die Probleme mit hoher Parallelität lösen müssen.


Informationen zum Prinzip und zur Implementierung der automatischen Generierung von Miniaturansichten basierend auf der URL finden Sie im Abschnitt „PHP-basiert“. on url“ habe ich zuvor geschrieben: Miniaturansichten automatisch generieren.


Prinzip der Verarbeitung hoher Parallelität:

1. Wenn festgestellt wird, dass ein Bild generiert werden muss, erstellen Sie eine temporäre Markierungsdatei im Verzeichnis tmp/. Der Dateiname lautet md5 (der zu generierende Dateiname). wird nach Abschluss der Bearbeitung gelöscht.

2. Wenn festgestellt wird, dass die zu generierende Datei eine temporäre Markierungsdatei im Verzeichnis tmp/ hat, was bedeutet, dass die Datei verarbeitet wird, wird dies bei der Methode zum Generieren von Miniaturansichten nicht der Fall sein aufgerufen werden, wartet jedoch, bis die temporäre Markierungsdatei gelöscht wird, wodurch eine erfolgreiche Ausgabe generiert wird.

Die geänderten Dateien sind wie folgt, andere sind die gleichen wie zuvor.


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));
}

?>


So generiert PHP automatisch Miniaturansichten basierend auf der URL und Behandelt hohe Anforderungen bezüglich des Inhalts von Parallelitätsproblemen. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn