簡體   English   中英

PHP cURL多處理導致服務器之間的隨機連接問題?

[英]PHP cURL multi handling causing random connection issues between servers?

我有一個網站,該網站跟蹤在線游戲的個人玩家數據。 每天同一時間運行cron,使用cURL從游戲公司的服務器中獲取每個玩家的數據(每個玩家都需要自己的頁面來獲取)。 以前,我遍歷每個播放器並一次創建自己的cURL請求並存儲數據-盡管這是一個緩慢的過程,但數周內一切正常(每天可處理500-1,000個播放器)。

隨着更多玩家的加入,cron開始耗時太長,因此大約一周前我使用ParallelCurl (cURL多重處理)重寫了cron。 它被設置為一次最多打開10個連接,並且運行良好-在3-4分鍾內完成約3,000頁。 直到一兩天之后,我再也沒有發現任何錯誤,因為我隨機無法連接到他們的服務器(返回http代碼0)。 我以為我被永久禁止/阻止,直到大約1-2小時后,我突然可以再次連接。 當天執行cron的幾個小時后就發生了阻止-當時唯一的請求是偶爾的單個文件請求(這些請求工作得很好,幾個月沒有受到影響)。

過去幾天都是這樣。 Cron運行正常,然后過了一段時間(幾個小時),我一兩個小時都無法連接。 今天,我將cron更新為一次只能打開5個連接-一切正常,直到5-6個小時后我無法連接2個小時。

我已經進行了大量的谷歌搜索,似乎找不到任何有用的東西。 我猜想可能是防火牆阻止了我的連接,但是當涉及到諸如此類的事情時,我真的很煩。 對於正在發生的事情以及修復它所需要做的事情,我真的一無所知。 我將不勝感激,希望您能為您提供幫助-甚至是猜測或正確方向的指點。

請注意,我正在使用共享的Web主機(HostGator)。 2天前,我提交了票證並在他們的論壇上發了帖,我還向公司發送了電子郵件,但還沒有收到任何答復。

- 編輯 -

這是我的使用parallelcurl運行多個請求的代碼。 包含內容保持不變,與此處顯示的相同

set_time_limit(0);

require('path/to/parallelcurl.php');

$plyrs = array();//normally an array of all the players i need to update

function on_request_done($content, $url, $ch, $player) {
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);    
    if ($httpcode !== 200) {
        echo 'Could Not Find '.$player.'<br />';
        return;
    } else {//player was found, store in db
        echo 'Updated '.$player.'<br />';
    }
}

$max_requests = 5;

$curl_options = array(
    CURLOPT_SSL_VERIFYPEER => FALSE,
    CURLOPT_SSL_VERIFYHOST => FALSE,
    CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9',
);

$parallel_curl = new ParallelCurl($max_requests, $curl_options);

foreach ($plyrs as $p) {
    $search_url = "http://website.com/".urlencode($p);
    $parallel_curl->startRequest($search_url, 'on_request_done', $p);
usleep(300);//now that i think about it, does this actually do anything worthwhile positioned here?
}

$parallel_curl->finishAllRequests();

這是我用來簡單查看是否可以連接的代碼

$ch = curl_init();

$options = array(
    CURLOPT_URL            => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_MAXREDIRS      => 10,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
);
curl_setopt_array( $ch, $options );
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

print_r(curl_getinfo($ch));

if ( $httpCode != 200 ){
    echo "Return code is {$httpCode} \n"
        .curl_error($ch);
} else {
    echo "<pre>".htmlspecialchars($response)."</pre>";
}

curl_close($ch);

當我無法連接時運行該命令將導致以下結果:

Array ( [url] => http://urlicantgetto.com/ [content_type] => [http_code] => 0 [header_size] => 0 [request_size] => 121 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 30.073574 [namelookup_time] => 0.003384 [connect_time] => 0.025365 [pretransfer_time] => 0.025466 [size_upload] => 0 [size_download] => 0 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => -1 [upload_content_length] => 0 [starttransfer_time] => 30.073523 [redirect_time] => 0 ) Return code is 0 Empty reply from server

聽起來這是網絡或防火牆問題,而不是PHP /代碼問題。

HostGator阻止出站連接,因為出站流量激增(可能被誤解為小型DOS攻擊),或者游戲網站出於相同原因而阻止了您。 特別是因為這僅在請求數量增加后才開始。 並且HTTP狀態代碼0表示防火牆行為

另外,在curl請求之后,連接可能無法正確關閉,之后再嘗試加載該網站或下載文件時,由於服務器上的打開連接已經太多,連接可能無法正確關閉。

如果您具有服務器的SSH訪問權限,則可能是網絡連接打開問題可以幫助您進行調試,否則,您需要與HostGator和游戲網站所有者聯系,以查看是否有一方完全阻止了您。

另一個解決方案可能是將游戲網站的抓取速度變慢(增加請求之間的等待時間),以避免被標記為網絡流量過大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM