2012-12-20 2 views
4

나는 PHP CURL을 사용하여 과도한로드가있는 사이트를 구문 분석합니다 (이 사이트는 브라우저에서 거의 열리지 않습니다). 결과에는 서버 응답 코드 503 또는 0 (아무 것도 없음)이 있습니다. 어쩌면 정상적인 서버 응답을 얻으려는 조언이나 CURL 기능을 말해 줄 수 있습니까?로드가 많은 사이트를 구문 분석 할 때 PHP CURL을 사용합니까?

내 CURL 옵션이있다 :

$options = array(
    CURLOPT_REFERER => $url, 
    CURLOPT_TIMEOUT => 1800, 
    CURLOPT_HEADER => true, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_SSL_VERIFYHOST => false, 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_HEADERFUNCTION => "curlHeaderCallback", 
    CURLOPT_COOKIE => Cookies::arrayToString(Cookies::instance()->load()), 
    CURLOPT_USERAGENT => "Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.9.168 Version/11.50", 
    CURLOPT_HTTPHEADER => $headers 
); 

문제는 내가 페이지 코드와 응답을받을 수 없다는 것입니다.

2 가지 변형이 있습니다. 1. 서버가 응답하지 않았습니다. 2. 서버의 대답에서 코드 503 "서버 과부하"페이지가 표시됩니다.

CurlHeaderCallback() 코드 :

`function curlHeaderCallback($ch, $str) 
{ 
if (strncmp($str, "Set-Cookie:", 11) === 0) 
    { 
    $cookie = trim(substr($str, 11)); 
    list($cookie, $options) = explode(";", $cookie, 2); 
    list($key, $value) = explode("=", $cookie, 2); 
    Cookies::instance()->set($key, $value); 
    } 
if (trim($str) == "") 
    { 
    curl_setopt($ch, CURLOPT_COOKIE, Cookies::arrayToString(Cookies::instance()->load())); 
    } 
return (strlen($str)); 
}` 

내 행동

은 다음과 같습니다 $response = curl_exec($ch); $info = curl_getinfo($ch);

내가 응답 및 $info["http_code"] 또는 두 번째 변종이 없다 : 응답 내가 페이지 503 코드와 $info["http_code"] = 503

아를 하나 더 선택할 수 있습니다 :

CURLOPT_CONNECTTIMEOUT => 30 

다이어그램은 여기에 있습니다 : 당신은 단지 HTTP 코드 후 경우 http://s61.radikal.ru/i172/1212/d6/33471472ee8e.png

+0

무엇이 문제입니까? 페이지를 가져 오려고 할 때 시간 초과가 발생했다는 말입니까? '$ headers'에 무엇이 있습니까? 'curlHeaderCallback()'의 코드는 무엇입니까? –

+0

CurlHeaderCallback() 코드 : '기능 curlHeaderCallback ($ ch를, $ str을) { 경우 (strncmp ($ STR, "설정 - 쿠키", 11) === 0) { $ 쿠키 = 트림 (SUBSTR ($ str, 11)); list ($ 쿠키, $ 옵션) = 폭발 (";", $ 쿠키, 2); list ($ key, $ value) = 폭발 ("=", $ 쿠키, 2); 쿠키 : instance() -> set ($ key, $ value); } if (trim ($ str) == "") { curl_setopt ($ ch, CURLOPT_COOKIE, Cookies :: instance() -> load()))); } return (strlen ($ str)); } ' – GrinderZ

+0

코멘트에 CurlHeaderCallback()을 게시하는 대신 원래 게시물을 편집하여 다시 추가 할 수 있습니다. 쉽게 읽을 수 있으며 다른 사람들은 쉽게 찾을 수 있습니다. –

답변

2

, 당신은, 예를 들어이되는 CURLINFO_HTTP_CODE를 사용하여 curl_getinfo를 사용해야합니다;

$handle = curl_init($url); 
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE); 
$response = curl_exec($handle); 
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); 
+0

사이트가 과부하되지 않으면 내 파싱이 효과적입니다. 모두 잘 작동합니다. – GrinderZ

+1

아, 그래, 그런 경우에도 물론 외국 서버가 시간 초과되면 문제에 관해 할 수있는 일이 많지 않다고 생각합니다. 물론 시간 초과되는 서버를 실행하지 않는 한 완전히 새로운 질문입니다! :) – Stu

+0

물론 타이밍을 초과하는 서버는 실행하지 않는 것이 좋습니다."시간이 초과 된 서버를 제어하지 않는 한"을 의미합니까? 이 의미는? – GrinderZ