2014-03-07 68 views
1

我在數據庫中有大約100k的URL,我想檢查所有的URL是否有效。我嘗試使用PHP和curl,但速度很慢並且腳本超時。有沒有更好的方法來使用其他shell腳本來做到這一點?多重網址存在檢查

到目前爲止,我嘗試這樣做:

// By default get_headers uses a GET request to fetch the headers. If you 
// want to send a HEAD request instead, you can do so using a stream context: 
stream_context_set_default(
    array(
     'http' => array(
      'method' => 'HEAD' 
     ) 
    ) 
); 
$headers = get_headers('http://example.com'); 

它的for循環運行英寸

回答

1

有很多在回答服務器的延遲,所以這個問題本身借給parallelising。嘗試將列表拆分爲多個子列表並且並行運行腳本,每個列表處理不同的列表。

嘗試查看split命令以生成列表。

所以,你會得到這樣的事情:

#!/bin/bash 
split -l 1000 urllist.txt tmpurl  # split bigfile into 1000 line subfiles called tmpurl* 
for p in tmpurl*      # for all tmpurl* files 
do 
    # Start a process to check the URLs in that list 
    echo start checking file $p in background &  
done 
wait         # till all are finished 

在哪裏我已經把「開始在後臺檢查文件$ ​​P」,你就需要提供一個簡單的PHP或shell腳本,需要一個文件名作爲參數(或從它的標準輸入讀取),然後檢查文件中所有URL的for循環,但是您已經在執行此操作。

額外的信息:

只是爲了好玩,我做了1000個網址和curl版標題的列表,從他們每個人,與curl -I -s。在順序案例中,花了4分19秒。當我使用上述腳本將1,000個URL分割成每個文件100個子列表並啓動10個進程時,整個測試花費了22秒 - 因此是12倍加速。將列表分割成50個URL的子列表,導致20個進程在14秒內完成。所以,如我所說,這個問題很容易並行。

+0

你的意思是創建多個腳本通過不同的URL位置? –

+0

是的,查看更新後的答案。這將創建100個進程,每個進程將使用您的號碼檢查1000個URL。 –

+0

答覆已更新,請參閱附加信息。 –

0

您可以使用機械化Python模塊來訪問網站,並採取應對從中

0

我bash的解決方案:

#!/bin/bash 

############################################### 
# mailto: [email protected] 
# checkurls 
# https://github.com/ggerman/checkurls 
# require curl 
############################################### 

url() { 
    cat urls.csv | 
    replace | 
    show 
} 

replace() { 
    tr ',' ' ' 
} 

show() { 
    awk '{print $1}' 
} 

url | \ 
while read CMD; do 
    echo $CMD 
    curl -Is $CMD | head -n 1 
done