ホームページ >バックエンド開発 >PHPチュートリアル >Web ページ上のすべての画像の長さと幅を最速で取得します。解決

Web ページ上のすべての画像の長さと幅を最速で取得します。解決

WBOY
WBOYオリジナル
2016-06-13 13:37:27817ブラウズ

Web ページ上のすべての画像の長さと幅を最速で取得します。
http://pinterest.com をプレイしたことがありますか?登録後、Web サイトの URL を送信して [画像の検索] を押すと、送信した Web ページ上のすべての画像が検索され、プロセス全体に通常 10 時間がかかります。数秒くらい。

最近真似してちょっとした機能部品を作りたいと思っています。邪悪な getimagesize() (48.64 秒かかる) は廃止され、imagecreatefromstring() (それでも 26.13 秒かかる) が使用されており、そのパフォーマンスは約 10 秒です。

TCP 接続の数を考慮し、サーバー リソースを最小限に抑え、実行時間を最小限に抑えます。全能のエビに助けを求めて、コードの最適化を続けるにはどうすればよいでしょうか?より速く走れるようになります。

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->

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);
}//curl设置

require dirname(__FILE__) . '/simple_html_dom.php'; 
//采用simple_html_dom.php分析HTML nod

$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;//得出长大于大于200,宽大于等于200的图片
        }
    }
}





-----解決策------------- - ------
サーバー ネットワークへの負荷を軽減するために、迂回することもできるかもしれません。
サーバーは、HTML データを解析し、画像タグ情報をカウントし、最後に収集したテキスト データをクライアントに送信する責任を負います。
画像の読み込みはクライアントによって行われ、幅と高さの属性を読み取るだけで画像の元のサイズが取得されます。
多くの利点がありますが、起こり得る問題はホットリンク対策です。
------解決策---------
最上階
PHP がリソースを取得
JavaScriptは画像の長さと幅を取得します
------解決策----------------------
2.8 秒で読み取りと解析
読み取りフェッチ写真 (138) 27 秒
7 個見つかりました

コードを最適化するだけなので、大したことはありません
マルチチャネルの同時実行を考慮できます
------解決策------------------
読み込みと解析 3.6 秒
画像処理読み込み開始 (138) 1.3 秒
結果ファイルのレコード数 7
PHP コード
http://s.huffpost.com/images/v/logos/v4/tagline.gif
http://s.huffpost.com/images/v/logos/v4/homepage.gif?v9
http://i.huffpost.com/gen/559399/thumbs/r-OLBERMANN-huge.jpg
http://s.huffpost.com/images/facebook_promo_connect.png?3
http://images.huffingtonpost.com/2012-04-04-michaeljfoxmarlo2SECOND.jpg
http://images.huffingtonpost.com/2012-04-05-Screenshot20120405at9.40.24AM.jpg
http://i.huffpost.com/gen/557914/thumbs/s-SCORSESE-large300.jpg
<br><font color="#e78608">------解決策---------</font><br>解決策はクライアントにFeasibleをロードさせることだと思います, <br><br>その後、クライアントは要件を満たす画像情報をサーバーに送信し、サーバーは再度検証して保存します。 。 。 <br><br><br>もう 1 つの 32768 はどうやって入手しましたか? 1-200では足りないのでしょうか?
<br><font color="#e78608">------解決策---------</font><br>学びましょう! PHP を使用して画像の URL を取得し、画像のヘッダー情報を直接読み取りますか?
<br><font color="#e78608">------解決策------------------</font><br>ピンタレストのピン機能は非常にクリエイティブかつ技術的です。これは、js コードの文字列をブックマークするだけです。このブックマークをクリックすると、現在のページのドキュメントに js ファイルを追加するのと同じになります。この js ファイルの記述方法は非常に簡単です。 document.getElementsByTagName('img')
<br><font color="#e78608">------解決策-----</font><br><strong>同時に138枚の写真を消費しますよね? 138 接続</strong><br>はい<br><br><strong>接続数を増やすには php.ini を変更する必要がありますか?</strong><br>いいえ、接続は外部に向けて行われます。変更、相手も変更 <br><br><strong>CPU とメモリのオーバーヘッドはどうですか</strong><br>これはテストするのが簡単ではありません<br><br><strong>と </strong> に関してjs を使用して判断する問題、コードが提供されなかったため、テストできませんでした<br>私が書いた 2 つの解決策は理想的ではなかったので、断念しました <br><br><strong>JS の使用リソース消費の観点から見ると、同時実行と PHP 直接同時実行、どちらも少なくなります</strong><br>リソース消費の観点から見ると、どちらも同じであり、どちらも画像を完全にロードする必要があります<br>ただし、前者ははクライアント側のリソースを消費し、後者はサーバー側のリソースを消費します<br>別のブラウザ メカニズムはよく理解されておらず、本当に同時実行であるかどうかは不明です。
<br><font color="#e78608">------解決策----------------------</font><br>このコードには約 1.8 秒かかります、File_get_html ( $url ) 時間は計算されません <br><br>$res [] = $url ;//$temp;<br>これはネットワーク アドレスです <br><br>ローカル ファイルとして保存されて使用されますgetimagesize サイズ <br><br> は、curl を通じて同時に取得する必要があります。このメカニズムについてはよくわかりません。
<br><font color="#e78608">------解決策---------</font><br>しかし if(in_array($absUrl, $visited ) )Continue; この行はエラーを報告します。警告: in_array() はパラメータ 2 が配列、null であることを想定しています。 <div class="clear"></div>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。