4

Вопрос по php – php получает все изображения из URL, ширина и высота которых> = 200 быстрее

Я симуляция какой-то функции, какhttp://pinterest.com add a pin

Как получить все изображения из URL, ширина и высота которых> 200 быстрее?pinterest.com закончу весь процесс почти за 10 секунд, но мне нужно 48,64 секунды.

require dirname(__FILE__) . '/simple_html_dom.php';
$url = 'http://www.huffingtonpost.com/';
$html = file_get_html($url);
if($html->find('img')){
    foreach($html->find('img') as $element) {
        $size = @getimagesize($element->src);
        if($size[0]>=200&&$size[1]>=200){
            echo $element;
        }
    }
}// cost 48.64 seconds
  • Error: User Rate Limit Exceededw3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35Error: User Rate Limit ExceededRange:Error: User Rate Limit Exceededphp.net/curl

    от
  • Error: User Rate Limit Exceeded

    от fish man
  • Error: User Rate Limit Exceededif ($size [0] >= $maxHeight && $size [0] >= $maxWidth)Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded$res [] = $temp;Error: User Rate Limit Exceeded$res [] = $url;Error: User Rate Limit ExceededunlinkError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от fish man
  • Только что получил скрипт, который запускается в 7sec - Still Testing

    от Baba
  • 10

    Я думаю, что вы используете, это запустить

    curl запросы вparallel с помощьюcurl_multi_init посмотри пожалуйстаhttp://php.net/manual/en/function.curl-multi-init.php для дополнительной информации. Таким образом, он будет загружаться намного быстрее и избежать проблем с пропускной способностью, которые также могут повлиять на скорость.

    Сохранить изображение в локальном временном каталоге, не запускатьgetimagesize() непосредственно на местном, что намного быстрее, чем запустить егоhttp://

    надеюсь, это поможет

    Edit 1

    Заметка***

    A. Не все изображения начинаются сhttp

    B. Не все изображения действительны

    C. Создатьtemp папка, в которой нужно хранить изображения

    Доказательство концепции

    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>";
    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);
    }
    

    Выход

    Array
    (
        [0] => temp/img8cdd64d686ee6b925e8706fa35968da4.gif
        [1] => temp/img5811155f8862cd0c3e2746881df9cd9f.gif
        [2] => temp/imga597bf04873859a69373804dc2e2c27e.jpg
        [3] => temp/img0914451e7e5a6f4c883ad7845569029e.jpg
        [4] => temp/imgb1c8c4fa88d0847c99c6f4aa17a0a457.jpg
        [5] => temp/img36e5da68a30df7934a26911f65230819.jpg
        [6] => temp/img068c1aa705296b38f2ec689e5b3172b9.png
        [7] => temp/imgfbeca2410b9a9fb5c08ef88dacd46895.png
    )
    0.076347
    

    Thanks :)

  • 1

    Ссылка

    использованиеimagecreatefromstring, imagesx а такжеimagesy, Это должно быть запущено через 30 секунд. немного быстрее, чем getimagesize ()

    function ranger($url){
        $headers = array( "Range: bytes=0-32768" );
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        return curl_exec($curl);
        curl_close($curl);
    }
    require dirname(__FILE__) . '/simple_html_dom.php';
    $url = 'http://www.huffingtonpost.com/';
    $html = file_get_html($url);
    if($html->find('img')){
        foreach($html->find('img') as $element) {
            $raw = ranger($element->src);
            $im = @imagecreatefromstring($raw);
            $width = @imagesx($im);
            $height = @imagesy($im);
            if($width>=200&&$height>=200){
                echo $element;
            }
        }
    }
    

  • 1

    А как насчет чтения ширины и высоты из HTML? Я знаю

    что некоторые изображения могут не иметь этих атрибутов, но, возможно, вы можете просто пропустить изображения с этими атрибутами меньше, чем 200px.

    Это просто идея обойти, но, возможно, не пригодится для вас.

  • 2

    getimagesize () сначала загрузит ВЕСЬ файл изображения

    а затем проведет анализ. как правило, вам нужны только первые пару сотен байтов файла, чтобы получить информацию о типе / разрешении. Кроме того, он будет использовать отдельный http-запрос для каждого изображения.

    Правильно оптимизированная система будет использовать запросы частичного получения для выборки только первой порции образа и использовать преимущества http-keep-alives для минимизации накладных расходов на соединение TCP.