2013-05-24 4 views
1

온라인 게임에 대한 개별 플레이어의 데이터를 추적하는 웹 사이트가 있습니다. 매일 cURL을 사용하여 게임 회사의 서버에서 각 플레이어의 데이터를 가져 오는 cron이 매일 실행됩니다 (각 플레이어는 자신의 페이지를 가져와야합니다). 이전에는 각 플레이어를 반복하면서 한 번에 자신의 cURL 요청을 작성하고 데이터를 저장했습니다. 느린 프로세스 였지만 모든 것이 수 주 동안 잘 진행되고있었습니다 (매일 500-1,000 명의 플레이어가 어디에서나하고있었습니다).PHP cURL 다중 처리로 서버간에 임의 연결 문제가 발생합니까?

우리가 더 많은 플레이어를 얻었으므로 cron이 너무 오래 실행되기 시작하여 약 1 주일 전에 ParallelCurl (cURL 다중 처리)을 사용하여 다시 작성했습니다. 한 번에 10 개 이하의 연결을 열도록 설정되어 완벽하게 실행되었습니다. 3 ~ 4 분 내에 약 3,000 페이지가 수행되었습니다. 하루나 이틀 후에 내가 무작위로 (http 코드 0을 반환하는) 서버에 연결할 수 없게 될 때까지 아무런 문제가 없었다. 나는 약 1 ~ 2 시간 후에 갑자기 다시 연결할 수있을 때까지 내가 영구적으로 금지/차단되었다고 생각했다. 이 블록은 cron이 하루 동안 실행 된 후 몇 시간 동안 발생했습니다. 당시에는 요청이 한 번만 발생했는데 (한 달 동안 제대로 작동하고 몇 달 동안 그대로 남아있었습니다) 요청이있었습니다.

지난 며칠 동안이 모든 것이 같았습니다. Cron은 잘 돌아 간다. 언젠가 몇 시간 후 (한시간) 언젠가는 1 ~ 2 시간 동안 연결할 수 없다. 오늘은 cron을 업데이트하여 한 번에 5 개의 연결 만 열었습니다. 5-6 시간이 지나면 2 시간 동안 연결할 수 없었습니다.

나는 인터넷 검색을 많이했기 때문에 유용한 것을 찾지 못했습니다. 아마도 방화벽이 내 연결을 차단하고있을 것이라고 추측 할 수 있습니다. 그런 일이 생길 때 내 머리를 쓰고 있습니다. 나는 일어나고있는 일에 관해 정말로 우둔하고, 그것을 해결하기 위해해야 ​​할 일은 무엇인가. 나는 어떤 도움에 대해서도 감사 할 것입니다 - 올바른 방향으로의 추측이나 정당한 지점조차도.

공유 웹 호스트 (HostGator)를 사용하고 있습니다. 2 일 전 티켓을 제출하고 포럼에 게시물을 올렸습니다. 회사에 전자 메일을 보냈지 만 아직 아무 것도받지 못했습니다.

--EDIT--

여기 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(); 

here를 표시하거나 내가 연결할 수있을 때 것을 실행하지

$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 

답변

1

PHP/코드 문제가 아닌 네트워크 또는 방화벽 문제인 것 같습니다.

작은 도트 공격으로 잘못 해석 될 수있는 아웃 바운드 트래픽이 증가했거나 동일한 이유로 게임 웹 사이트가 사용자를 차단했기 때문에 HostGator가 아웃 바운드 연결을 차단합니다. 특히 요청 수가 증가한 이후에만 시작되었습니다. 또한 HTTP status code of 0 suggests firewall behaviour도 있습니다.

다른 방법으로 말하자면 연결이 제대로 닫히지 않았거나 서버에서 너무 많은 열린 연결이 있기 때문에 해당 웹 사이트를로드하고로드 할 수없는 파일을 다운로드 할 수 있습니다.

서버에 SSH로 액세스 할 수있는 경우 네트워크 연결 문제가 있으면 디버깅하는 데 도움이 될 수 있습니다. 그렇지 않으면 HostGator 및 게임 웹 사이트 소유자와 통화하여 상대방이 귀하를 차단하고 있는지 확인해야합니다 모든.

또 다른 해결책은 높은 웹 트래픽으로 표시되는 것을 피하기 위해 게임 웹 사이트를 더 천천히 긁어서 (요청 사이의 대기 시간을 도입하는 것일 수 있습니다.

+0

마침내 HostGator와 연락을 취했고 거의 도움이되지는 않았지만 연결을 막으려면 아무 것도 실행되지 않았다고 주장했습니다. 슬프게도 게임 회사는 끔찍한 고객 서비스로 악명이 높습니다. 솔직히 내가 얼마나 많은 이메일을 보내고 있건 상관없이 회신을 받을지는 의심 스럽습니다. 잠재적 인 ddos ​​공격으로 나를 차단할 수는 있지만 요청이 이루어진 지 몇 시간 후에 문자 그대로 블록이 발생하는 것은 당연한가? 나는 요청 사이에 얼마나 오래 자야한다고 생각하는지 궁금합니다. 300ms? 1000ms? 감사. –

+0

그래, 지연이별로 의미가 없어 ... 그냥 HostGator에서 게임 웹 사이트에 연결할 수 없다는 것을 확인하기 위해? 연결할 수없는 집/사무실 위치가 아닙니까? 나는 아마도 500ms, 아마도 250ms 동안 잠을 자지 만, 잠자기 시간이 길어질수록 덜 깃발을지게 될 것입니다. – Jon

+0

예, 서버가 연결할 수 없습니다. 4.5 시간 전 각 핸들 사이에 300ms의 수면 상태로 cron을 업데이트했습니다. 한 번만 실행하면 문자 그대로 5 분 전에 아무런 문제없이 연결할 수있었습니다. 이제 다시 연결할 수 없습니다. –