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

Patricia Arquette
Freigeben: 2024-10-26 04:02:28
Original
172 Leute haben es durchsucht

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!