2012-06-30 34 views
1

我正在談論執行大約5分鐘以上的深度遞歸,您可能有一個爬蟲執行的事情。爲了提取URL鏈接和與PHP - 那裏有一個安全的方法來執行深度遞歸?

似乎在PHP深遞歸似乎並不現實

如子URL鏈接

getInfo("www.example.com"); 

function getInfo($link){ 
    $content = file_get_content($link) 

    if($con = $content->find('.subCategories',0)){ 
     echo "go deeper<br>"; 
     getInfo($con->find('a',0)->href); 
    } 

    else{ 
     echo "reached deepest<br>"; 
    } 
} 
+0

這也比任何其他語言不太現實。只要您將其配置爲不遵守執行時間限制,並使用適當的退出對遞歸進行編碼。 –

+0

這非常符合實際,但您可能需要保留先前訪問的鏈接列表以避免無限循環。 – Ryan

回答

8

用遞歸做這樣的事情在任何語言中實際上都是一個壞主意。您無法知道該爬蟲會走多遠,因此可能會導致堆棧溢出。如果不是,它仍然浪費了一堆龐大的內存,因爲PHP沒有尾部調用(除非必要,不保留任何堆棧信息)。

推找到的網址變成了「抓取」隊列這是反覆檢查:

$queue = array('www.example.com'); 
$done = array(); 
while($queue) { 
    $link = array_shift($queue); 
    $done[] = $link; 
    $content = file_get_contents($link); 
    if($con = $content->find('.subCategories', 0)) { 
     $sublink = $con->find('a', 0)->href; 
     if(!in_array($sublink, $done) && !in_array($sublink, $queue)) { 
      $queue[] = $sublink; 
     } 
    } 
} 
+0

您可能想要對需要PHP 5.4的'[]'進行註釋。哦,等等,我想這個評論也是如此。 – Ryan

+0

或者我用'array()'替換它。太習慣於適當的語言[']'年齡... @Eric:Nope,'[]'對於數組文字在PHP 5.4中是新的。 – ThiefMaster

+1

@ThiefMaster:祝賀你的版主頭銜。你能否詳細說明爲什麼在任何語言中做這樣的事情都不好?我認爲這將有益於答案 –