온라인 게임에 대한 개별 플레이어의 데이터를 추적하는 웹 사이트가 있습니다. 매일 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
마침내 HostGator와 연락을 취했고 거의 도움이되지는 않았지만 연결을 막으려면 아무 것도 실행되지 않았다고 주장했습니다. 슬프게도 게임 회사는 끔찍한 고객 서비스로 악명이 높습니다. 솔직히 내가 얼마나 많은 이메일을 보내고 있건 상관없이 회신을 받을지는 의심 스럽습니다. 잠재적 인 ddos 공격으로 나를 차단할 수는 있지만 요청이 이루어진 지 몇 시간 후에 문자 그대로 블록이 발생하는 것은 당연한가? 나는 요청 사이에 얼마나 오래 자야한다고 생각하는지 궁금합니다. 300ms? 1000ms? 감사. –
그래, 지연이별로 의미가 없어 ... 그냥 HostGator에서 게임 웹 사이트에 연결할 수 없다는 것을 확인하기 위해? 연결할 수없는 집/사무실 위치가 아닙니까? 나는 아마도 500ms, 아마도 250ms 동안 잠을 자지 만, 잠자기 시간이 길어질수록 덜 깃발을지게 될 것입니다. – Jon
예, 서버가 연결할 수 없습니다. 4.5 시간 전 각 핸들 사이에 300ms의 수면 상태로 cron을 업데이트했습니다. 한 번만 실행하면 문자 그대로 5 분 전에 아무런 문제없이 연결할 수있었습니다. 이제 다시 연결할 수 없습니다. –