Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mendapatkan Imej dengan Cekap daripada URL dengan Dimensi Lebih Besar Daripada atau Sama dengan 200px?

Bagaimana untuk Mendapatkan Imej dengan Cekap daripada URL dengan Dimensi Lebih Besar Daripada atau Sama dengan 200px?

Barbara Streisand
Barbara Streisandasal
2024-10-28 02:28:02995semak imbas

How to Efficiently Retrieve Images from a URL with Dimensions Greater Than or Equal to 200px?

Cara Mendapatkan Imej daripada URL dengan Dimensi Lebih Besar Daripada atau Sama dengan 200px Dengan Cekap

Dalam usaha mencipta ciri yang serupa dengan Pinterest "Tambah Pin," timbul persoalan tentang cara mendapatkan semula semua imej dengan cepat daripada URL tertentu yang mempunyai lebar dan ketinggian lebih daripada atau sama dengan 200 piksel. Walaupun kod yang disediakan mengambil masa 48.64 saat untuk menyelesaikan proses, ia boleh dipercepatkan dengan ketara dengan pengoptimuman berikut:

  1. Pemprosesan Selari: Gunakan curl_multi_init untuk melaksanakan berbilang permintaan curl serentak, mengurangkan had lebar jalur dan mempercepatkan mendapatkan semula imej.
  2. Storan Imej Setempat: Elakkan memanggil getimagesize() melalui HTTP dengan memuat turun imej terus ke direktori sementara setempat. Pendekatan ini meningkatkan prestasi secara dramatik berbanding dengan pengesahan jauh.
<code class="php">// PHP script using curl_multi_init for parallel image retrieval
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>

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Imej dengan Cekap daripada URL dengan Dimensi Lebih Besar Daripada atau Sama dengan 200px?. 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