2011-02-01 12 views
0

単純なhtml domでページあたりのすべての画像を保存する簡単なパーサーを作成し、画像クラスを取得しましたが、ページ内を移動するためにループ内にループを作成しなければならず、非常に遅く、タイムアウトまたはメモリが常に超過するので、私のコードでは最適化されていません。コードをすばやく見て、誰かが私が作ったばかげた何かを見ることができますか?simple_html_domを使ったPHP解析、

$pageNumbers = array(); //Array to hold number of pages to parse 

$url = 'http://sitename/category/'; //target url 
$html = file_get_html($url); 


//Simply detecting the paginator class and pushing into an array to find out how many pages to parse placing it into an array 
foreach($html->find('td.nav .str') as $pn){ 
    array_push($pageNumbers, $pn->innertext);    
} 

// initializing the get image class 
$image = new GetImage; 
$image->save_to = $pfolder.'/'; // save to folder, value from post request. 

//Start reading pages array and parsing all images per page. 
foreach($pageNumbers as $ppp){ 

    $target_url = 'http://sitename.com/category/'.$ppp; //Here i construct a page from an array to parse. 
    $target_html = file_get_html($target_url); //Reading the page html to find all images inside next. 

    //Final loop to find and save each image per page. 
    foreach($target_html->find('img.clipart') as $element) { 
     $image->source = url_to_absolute($target_url, $element->src); 
     $get = $image->download('curl'); // using GD 
     echo 'saved'.url_to_absolute($target_url, $element->src).'<br />';   
    } 

} 

ありがとう...含まここ

がライブラリなしでコードです。

+0

[プロファイルコードの最適な方法は何ですか](http://stackoverflow.com/questions/133686/what-is-the-best-way-to-profile-php-code) – Gordon

答えて

1

ここではかなりたくさんのことをしていますが、スクリプトがタイムアウトするのは驚きではありません。あなたは複数のWebページをダウンロードし、それらを解析し、その中の画像を見つけ、それらの画像をダウンロードします...ページ数は何ページ、ページあたりの画像数ですか?我々が非常に小さな数字を話していない限り、これは予想される。

あなたの質問が本当に何であるかは分かりませんが、「私はこの仕事をどうやって作っていますか?」と仮定しています。あなたはいくつかの選択肢があります。それは本当にこれが何であるかによって異なります。いくつかのサイトを掻き集める一度限りのハックであれば、メモリと時間制限を増やし、多少作業をまとめることができ、次回はもっと適切なものに書き込んでください)

サーバサイドで発生すると、おそらくユーザのやりとりに非同期的に起こっているはずです。つまり、ユーザがページをリクエストするのではなく、これをすべて返す前に行う必要があります。それはPHPである必要はありません、あなたはスクラップに物事を渡して、それを行う任意の言語で実行されているスクリプトを持つことができます。

+0

ありがとう私のコードがうんざりしていることを指摘するために、simple_html_domクラスは私がやっていることとまったく同じように存在するが、単純にそれを最悪のやり方にしたのかという疑問だった。 – devjs11

+0

あなたの言葉から、私が今まで行ってきたことを改善する方法はありませんか?全体を削除して、最初から始めますか? – devjs11

+0

私は明らかにする、これは吸いません。私はJava + JSoupでスクラップすることをやってきました。この問題を解決していたら、私のコードはあなたと非常に似ています。これは通常、通常は30秒しかかからないスクリプト言語で対処する問題のようなものではありません。コードよりも高いレベルで問題を説明できる場合(つまり、実際に何を達成しようとしていますか?)、おそらく私はこれを改善する方法についてより良い提案をすることができます。 – ZoFreX

2

実際の単純なhtml dom処理を行うための関数を作ることをお勧めします。 私は通常、以下の「テンプレート」を使用します...「メモリの消去」セクションに注意してください。 明らかにPHP 5でメモリリークがあります...少なくとも私はその場所を読んでいます。

function scraping_page($iUrl) 
{ 
    // create HTML DOM 
    $html = file_get_html($iUrl); 

    // get text elements 
    $aObj = $html->find('img'); 

    // do something with the element objects 

    // clean up memory (prevent memory leaks in PHP 5) 
    $html->clear(); // **** very important **** 
    unset($html); // **** very important **** 

    return; // also can return something: array, string, whatever 
} 

+0

4ヶ月前の質問にバンプする理由 – dynamic

+0

メモリリークの問題は非常に面白いです。あなたはリンクを提供できますか? –

+1

これは将来誰かを救うかもしれないと思った:http://simplehtmldom.sourceforge.net/manual_faq.htm#memory_leak – akeane