Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mencapai Pengekstrakan Imej yang Lebih Pantas daripada URL dengan Dimensi Tertentu?

Bagaimana untuk Mencapai Pengekstrakan Imej yang Lebih Pantas daripada URL dengan Dimensi Tertentu?

Patricia Arquette
Patricia Arquetteasal
2024-10-26 04:02:28173semak imbas

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

Mendapatkan Imej daripada URL dengan Dimensi Lebih Besar Dengan Cekap

Dalam soalan ini, objektifnya adalah untuk mengoptimumkan proses mengekstrak imej dengan dimensi lebih besar daripada atau sama dengan 200 piksel dalam lebar dan tinggi daripada URL yang diberikan. Pendekatan awal menggunakan file_get_html() dan getimagesize() menghasilkan masa pelaksanaan yang perlahan selama 48.64 saat.

Pendekatan yang Diperbaiki:

Untuk meningkatkan kecekapan, langkah-langkah berikut telah dicadangkan:

  1. Pelaksanaan Selari: Gunakan curl_multi_init untuk pelaksanaan selari permintaan curl, mempercepatkan pengambilan semula imej.
  2. Storan Imej Setempat: Elakkan melakukan getimagesize() pada lokasi imej terpencil dengan menyimpan imej sementara ke direktori setempat.
  3. Mengendalikan Variasi Imej: Pertimbangkan bahawa URL imej mungkin tidak selalu bermula dengan "http" dan mungkin mengandungi format yang tidak sah, yang boleh diselesaikan dengan sewajarnya.

Kod Contoh:

<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>

Pendekatan yang dikemas kini ini menunjukkan peningkatan kelajuan yang ketara, mendapatkan imej dalam hanya 0.076 saat berbanding 48.64 saat yang asal.

Atas ialah kandungan terperinci Bagaimana untuk Mencapai Pengekstrakan Imej yang Lebih Pantas daripada URL dengan Dimensi Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn