Heim  >  Artikel  >  Backend-Entwicklung  >  So lassen Sie PHP automatisch Miniaturansichten basierend auf URLs generieren und Probleme mit hoher Parallelität bewältigen

So lassen Sie PHP automatisch Miniaturansichten basierend auf URLs generieren und Probleme mit hoher Parallelität bewältigen

jacklove
jackloveOriginal
2018-06-09 14:18:081802Durchsuche

Es gibt im Allgemeinen zwei Arten von Timings für die Generierung von Miniaturansichten durch den Server:

1. Wird beim Hochladen einer Datei generiert

Vorteile: Die erforderlichen Miniaturansichten werden bereits beim Hochladen generiert und es besteht keine Notwendigkeit, beim Lesen neu zu beurteilen, wodurch die CPU-Belastung reduziert wird.

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. Generieren beim Zugriff

Vorteile: 1. Generieren Sie nur, wenn ein Benutzer zugreift, kein Zugriff. Keine Notwendigkeit zu generieren, platzsparend.

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 URLs finden Sie in dem Artikel „PHP generiert automatisch Miniaturansichten basierend auf URLs“, den ich zuvor geschrieben habe.

Prinzip der hohen Parallelität:

1 muss generiert werden. Erstellen Sie eine temporäre Markierungsdatei im Verzeichnis tmp/, benennen Sie die Datei mit md5 (dem Dateinamen, der generiert werden muss) und löschen Sie die temporäre Datei, nachdem die Verarbeitung abgeschlossen ist.

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

In diesem Artikel wird erläutert, wie PHP automatisch Miniaturansichten basierend auf URLs generieren und mit hoher Parallelität umgehen kann. Frage: Weitere verwandte Fragen finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Über den Vergleich zwischen PHP-String-Komprimierungsmethoden

Über die PHP-Timer-Seitenlaufzeitüberwachung Relevante Einführung in Klassen

Einführung in die Methoden des PHP-Konstruktors, der eine unterschiedliche Anzahl von Parametern unterstützt

Das obige ist der detaillierte Inhalt vonSo lassen Sie PHP automatisch Miniaturansichten basierend auf URLs generieren und Probleme mit hoher Parallelität bewältigen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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