Rumah > pembangunan bahagian belakang > tutorial php > ## Bagaimana Cara Mengambil Imej daripada URL dengan Ambang Dimensi dengan Cekap?

## Bagaimana Cara Mengambil Imej daripada URL dengan Ambang Dimensi dengan Cekap?

Linda Hamilton
Lepaskan: 2024-10-27 05:40:29
asal
448 orang telah melayarinya

## How to Efficiently Fetch Images from URLs with Dimension Thresholds?

Mengambil Imej daripada URL dengan Ambang Lebar dan Ketinggian Dengan Cekap

Masalah:

Mendapatkan semula imej daripada URL tertentu yang memenuhi keperluan lebar dan ketinggian tertentu, seperti imej dengan kedua-dua dimensi lebih besar daripada atau sama dengan 200 piksel, adalah tugas biasa dalam pembangunan web. Walau bagaimanapun, proses ini boleh memakan masa menggunakan kaedah tradisional.

Pendekatan Semasa:

Kod yang disediakan berulang melalui semua elemen pada URL yang diberikan, mendapatkan semula dimensi imej menggunakan getimagesize(). Walaupun pendekatan ini berfungsi, masa pelaksanaannya boleh dilihat dengan ketara.

Penyelesaian Cadangan:

Untuk mempercepatkan proses, pertimbangkan pengoptimuman ini:

  • Muat Turun Imej Selari: Gunakan fungsi curl_multi_init untuk memuat turun imej secara serentak. Teknik ini mengurangkan masa pengambilan keseluruhan dengan memulakan berbilang permintaan secara serentak.
  • Storan Fail Setempat: Daripada menjalankan getimagesize() terus pada imej daripada URL HTTP, muat turunnya secara setempat dan simpannya dalam folder sementara. Ini mengelakkan overhed permintaan HTTP untuk mendapatkan semula dimensi.

Pelaksanaan Kod:

Kod berikut membentangkan pelaksanaan yang lebih cekap yang menggabungkan pengoptimuman ini:

<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 && $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>
Salin selepas log masuk

Faedah:

  • Kod yang dioptimumkan mengurangkan masa pengambilan dengan ketara berbanding pendekatan asal.
  • Ia menggunakan muat turun selari menggunakan curl_multi_init, meningkatkan kecekapan.
  • Strategi storan fail setempat menjimatkan masa dengan mengelakkan permintaan HTTP berulang untuk mendapatkan semula dimensi.

Atas ialah kandungan terperinci ## Bagaimana Cara Mengambil Imej daripada URL dengan Ambang Dimensi dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan