2014-09-28 19 views
0

我試圖同時獲取10個網頁。如何在使用curl_multi時防止503錯誤

我正在使用curl_multi。

但是我最終在大部分被抓取的網頁上發現了很多503(太多的請求)錯誤。我怎樣才能解決這個問題?

這是我跑的php腳本。 http://pastebin.com/HhrffciC

你可以在任何支持php的服務器上運行它。

這是我的機器上的輸出看起來像。 http://i.imgur.com/dhnXJwz.jpg

+0

看起來你試圖聯繫的服務器不希望你一次發送很多請求(這實際上很聰明,以防止暴力攻擊)。嘗試一次一個請求嗎? – wavemode 2014-09-28 19:55:59

+0

欣賞您的回覆。是的,似乎是這樣。問題是我想同時獲取10個網頁。如果我一個一個地做,它需要15-20秒,這是很多時間,因爲我需要每分鐘運行一次這個腳本。我想知道是否有一種方法可以配置curl_multi函數來延遲請求,以便服務器不會認爲我試圖強制它。任何其他實現該方法的方法也將被讚賞。 – tacoder 2014-09-28 20:12:23

+0

因爲我只會返回json數據,所以我在考慮只是爲了防止php會成爲大腦中的痛苦,也許我可以完全使用不同的語言並在其中進行處理。任何指針,也將不勝感激。 – tacoder 2014-09-28 20:13:56

回答

1

有一個名爲ParallelCurl的庫,可以讓您控制發送多少個同步請求。下面的腳本將最大值設置爲5,並簡單地向您的代碼中的URL發送一系列GET請求。如果這爲您顯示503錯誤(它不適合我),您可以根據您的需要降低$max_requests

<?php 

require __DIR__ . '/parallelcurl.php'; 

function on_request_done($content, $url, $ch, $search) { 
    echo $content; 
} 

$data = array(
    'http://www.codechef.com/status/CLETAB,tacoder', 
    'http://www.codechef.com/status/CRAWA,tacoder', 
    'http://www.codechef.com/status/EQUAKE,tacoder', 
    'http://www.codechef.com/status/MOU2H,tacoder', 
    'http://www.codechef.com/status/PRGIFT,tacoder', 
    'http://www.codechef.com/status/PUSHFLOW,tacoder', 
    'http://www.codechef.com/status/REVERSE,tacoder', 
    'http://www.codechef.com/status/SEASHUF,tacoder', 
    'http://www.codechef.com/status/SIGFIB,tacoder', 
    'http://www.codechef.com/status/TSHIRTS,tacoder' 
); 

$max_requests = 5; 
$parallel_curl = new ParallelCurl($max_requests); 

foreach ($data as $url) { 
    $parallel_curl->startRequest($url, 'on_request_done'); 
} 

$parallel_curl->finishAllRequests(); 

GitHub自述文件解釋瞭如何進一步使用庫。

+0

因爲沒有足夠的聲望而無法贊成。 只是我尋找的完美答案。非常感謝你!! – tacoder 2014-09-28 21:18:20

+0

@tacoder Upvoted for you:D – Kalko 2017-03-28 09:53:44