2013-08-24 2 views
0

다음 코드를 사용하여 Perl AnyEvent HTTP 모듈을 사용하여 비동기 요청을 시도했습니다.Perl AnyEvent throw HTTP Error 595

{ 
    'Reason' => 'Connection timed out', 
    'URL' => 'url requested', 
    'Status' => 595 
}; 

나는이 오류의 원인에 대한 AnyEvent 문서를 확인하고했지만, 그와 함께 성공하지 않은 :

my $headers = { 
    'Accept'   => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'Accept-Language'=> 'en-us,en;q=0.5', 
    'Connection'  => 'keep-alive' 
}; 

$request = http_request (
    GET => "$url", 
    timeout => 5, # seconds 
    # persistent => 1, 
    # keepalive => 1, 
    headers => $headers, 
    proxy => $proxyRef, 
    sub { 
     my ($body, $hdr) = @_; 
    } 
); 

내가 요청에서 다음 반응을 얻고 유지. Cant는 동일한 결과를 산출하는 타임 아웃시 재시도 제안을 제외하고이 문제에 대한 다른 유용한 스레드를 찾습니다. 간단한 'wget'은 동일한 URL 및 해당 URL에서 작동합니다. 누구든지이 문제를 디버깅하는 방법을 지적 할 수 있습니까?

+0

제한 시간을 50으로 늘리면 어떻게됩니까? 심지어 – ikegami

+0

같은 결과! –

+0

어떻게 이벤트 루프를 시작 하시겠습니까? $ 요청은'my'-ed가 아니며, 다른 곳에서 사용됩니까? 코드 예제가 실제로 최소한의 실행 가능한 스크립트라면 도움이 될 것입니다. – Dallaylaen

답변

1

"Connction timed out"오류는 내부 TCP 연결 시간이 초과되었음을 나타냅니다. 즉, AnyEvent :: HTTP가 웹 서버 또는 프록시에 연결하려고하면 연결 요청 시간이 초과됩니다 (일반적으로 약 30 초 후). 이 타임 아웃을 이식 할 수있는 방법은 없습니다.

특히이 문제는 요청 자체 (해당 단계가 아직 입력되지 않은 상태) 또는 DNS 확인에 문제가 없으며 서버가 연결을 거부하지 않습니다. 문제는 서버가 응답하지 않는 것입니다. 즉, 서버가 꺼져 있거나 서버와의 인터넷 연결이 끊어 졌거나 방화벽이 자동으로 연결을 차단합니다.

업데이트

난 그냥 인해 약간 다른 문제로이 문제에 실행 사용자의 보고서를 가지고 - 그는 HTTP 요청을 시작하는 대신 이벤트 루프에 반환, 그는 그의 프로그램을 차단 시간 초과 (sleep 사용)보다 길어집니다. 즉, 그는 HTTP 요청을 시작한 다음 이벤트 라이브러리가 작동하지 않도록 유지했습니다. 컨트롤이 마지막으로 rturned되었을 때 AnyEvent :: HTTP immediatelly timeouted. 시간 내에 연결을 만들 수 없었습니다.

Anything :: HTTP는 서버/네트워크 지연으로 인해 연결 시간 초과가 발생했는지 또는 단순히 CPU 시간을 충분히 확보하지 못했는지 알 수없는 이유 일 수 있습니다. 필요한 시간에 요청하십시오.

이러한 경우의 수정은 편리하게 더 오래 걸릴 수 있도록 시간 제한을 낮추거나 사용 가능한 CPU 시간이 거의 없어도 시간이 충분하거나 프로그램을 실행하여 이벤트 기반 방식으로 작성되도록 구조 조정하는 것입니다 이벤트 루프 및 절전 모드 대신 타이머 사용