Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erreicht man eine schnellere Bildextraktion aus URLs mit bestimmten Abmessungen?

Wie erreicht man eine schnellere Bildextraktion aus URLs mit bestimmten Abmessungen?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 04:02:28173Durchsuche

How to Achieve Faster Image Extraction from URLs with Specific Dimensions?

Effizientes Abrufen von Bildern von URLs mit größeren Abmessungen

Bei dieser Frage bestand das Ziel darin, den Prozess der Extraktion von Bildern mit Abmessungen größer oder gleich 200 Pixel zu optimieren Breite und Höhe einer bestimmten URL. Der anfängliche Ansatz mit file_get_html() und getimagesize() führte zu einer langsamen Ausführungszeit von 48,64 Sekunden.

Verbesserter Ansatz:

Um die Effizienz zu steigern, wurden die folgenden Schritte durchgeführt vorgeschlagen:

  1. Parallele Ausführung: Verwenden Sie curl_multi_init für die parallele Ausführung von Curl-Anfragen, um den Abruf von Bildern zu beschleunigen.
  2. Lokale Bildspeicherung: Vermeiden Sie die Ausführung von getimagesize() an entfernten Bildspeicherorten, indem Sie die Bilder vorübergehend in einem lokalen Verzeichnis speichern.
  3. Umgang mit Bildvariationen: Bedenken Sie, dass Bild-URLs möglicherweise nicht immer mit „http“ und beginnen kann ungültige Formate enthalten, die entsprechend aufgelöst werden können.

Beispielcode:

<code class="php">require 'simple_html_dom.php';
$url = 'http://www.huffingtonpost.com';
$html = file_get_html ( $url );
$nodes = array ();
$start = microtime ();
$res = array ();

if ($html->find ( 'img' )) {
    foreach ( $html->find ( 'img' ) as $element ) {
        if (startsWith ( $element->src, "/" )) {
            $element->src = $url . $element->src;
        }
        if (! startsWith ( $element->src, "http" )) {
            $element->src = $url . "/" . $element->src;
        }
        $nodes [] = $element->src;
    }
}

echo "<pre class="brush:php;toolbar:false">";
print_r ( imageDownload ( $nodes, 200, 200 ) );
echo "<h1>", microtime () - $start, "</h1>";

function imageDownload($nodes, $maxHeight = 0, $maxWidth = 0) {

    $mh = curl_multi_init ();
    $curl_array = array ();
    foreach ( $nodes as $i => $url ) {
        $curl_array [$i] = curl_init ( $url );
        curl_setopt ( $curl_array [$i], CURLOPT_RETURNTRANSFER, true );
        curl_setopt ( $curl_array [$i], CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)' );
        curl_setopt ( $curl_array [$i], CURLOPT_CONNECTTIMEOUT, 5 );
        curl_setopt ( $curl_array [$i], CURLOPT_TIMEOUT, 15 );
        curl_multi_add_handle ( $mh, $curl_array [$i] );
    }
    $running = NULL;
    do {
        usleep ( 10000 );
        curl_multi_exec ( $mh, $running );
    } while ( $running > 0 );

    $res = array ();
    foreach ( $nodes as $i => $url ) {
        $curlErrorCode = curl_errno ( $curl_array [$i] );

        if ($curlErrorCode === 0) {
            $info = curl_getinfo ( $curl_array [$i] );
            $ext = getExtention ( $info ['content_type'] );
            if ($info ['content_type'] !== null) {
                $temp = "temp/img" . md5 ( mt_rand () ) . $ext;
                touch ( $temp );
                $imageContent = curl_multi_getcontent ( $curl_array [$i] );
                file_put_contents ( $temp, $imageContent );
                if ($maxHeight == 0 || $maxWidth == 0) {
                    $res [] = $temp;
                } else {
                    $size = getimagesize ( $temp );
                    if ($size [1] >= $maxHeight &amp;&amp; $size [0] >= $maxWidth) {
                        $res [] = $temp;
                    } else {
                        unlink ( $temp );
                    }
                }
            }
        }
        curl_multi_remove_handle ( $mh, $curl_array [$i] );
        curl_close ( $curl_array [$i] );

    }

    curl_multi_close ( $mh );
    return $res;
}

function getExtention($type) {
    $type = strtolower ( $type );
    switch ($type) {
        case "image/gif" :
            return ".gif";
            break;
        case "image/png" :
            return ".png";
            break;

        case "image/jpeg" :
            return ".jpg";
            break;

        default :
            return ".img";
            break;
    }
}

function startsWith($str, $prefix) {
    $temp = substr ( $str, 0, strlen ( $prefix ) );
    $temp = strtolower ( $temp );
    $prefix = strtolower ( $prefix );
    return ($temp == $prefix);
}</code>

Dieser aktualisierte Ansatz zeigte erhebliche Geschwindigkeitsverbesserungen und das Abrufen von Bildern in nur wenigen Minuten 0,076 Sekunden im Vergleich zu den ursprünglichen 48,64 Sekunden.

Das obige ist der detaillierte Inhalt vonWie erreicht man eine schnellere Bildextraktion aus URLs mit bestimmten Abmessungen?. 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