PHP cURL HTTP CODE 반환 0


95

나는 $ httpCode를 에코 할 때 이해하지 못합니다. 항상 0을 얻습니다. $ html_brand를 깨진 URL로 변경할 때 404를 예상했습니다. 내가 놓쳤거나 모르는 것이 있습니까? 감사.

 //check if url exist
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $html_brand);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($httpCode == 404) {
    echo "The Web Page Cannot Be Found";
    return;
}
curl_close($ch);

답변:


95

서버에 연결하면 반환 코드를 얻을 수 있습니다. 그렇지 않으면 실패하고 0을 얻습니다. 따라서 "www.google.com/lksdfk"에 연결하려고하면 다음과 같은 반환 코드가 표시됩니다. 400, google.com으로 직접 이동하면 302가 표시됩니다 (다음 페이지로 이동하면 200이 표시됩니다. google.com.br로 이동하므로 이해하지 못할 수도 있습니다). 그리고 "googlecom"으로 이동하면 0 (호스트를 찾을 수 없음)이 표시되므로 마지막 코드에서는 코드를 다시 보낼 사람이 없습니다.

아래 코드를 사용하여 테스트했습니다.

<?php

$html_brand = "www.google.com";
$ch = curl_init();

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

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

curl_close($ch);

1
또한 followlocation을 참조하기 위해 thx, 때로는 리디렉션 문제인 301을 얻습니다.
Ardeus 2012

$ response에 html 내용이 있지만 $ httpcode는 항상 0을 반환하고 curl_error는 null입니다. 가능한 일이 잘못되었습니다. 설정에만 returntransfer, header (false), followlocation 만 포함합니다.
Ardeus

추가하기 위해 URL 앞뒤에 공백이 있으면 http_code = 0
Raja Amer Khan 19


80

curl_exec 후에 이것을 시도하여 문제가 무엇인지 확인하십시오.

print curl_error($ch);

'잘못된 형식'과 같이 인쇄 된 경우 URL 형식을 확인하십시오.


5
그 제안에 감사드립니다-내 엉덩이를 저장 :)
wbj

예! 내 엉덩이를 구했다.
pimbrouwers

5

숨겨진 오류를 찾으 려면 curl_getinfo 다음에 curl_error를 확인하십시오 .

if(curl_errno($ch)){   
    echo 'Curl error: ' . curl_error($ch);
}

2

여기 와 아래에서 언급 했듯이 실패한 요청 ( 즉, 서버를 찾을 수 없음 )은 응답이 수신되지 않았기 때문에 HTTP 상태 코드가없는 false를 반환합니다.

에게 전화하십시오 curl_error().


2

나는 같은 문제가 있었고 내 경우에는 curl_exec 기능이 php.ini에서 비활성화되어 있기 때문입니다. 로그 확인 :

PHP Warning:  curl_exec() has been disabled for security reasons in /var/www/***/html/test.php on line 18

해결책은 서버 구성 파일의 php.ini에서 비활성화 된 기능에서 curl_exec를 제거하는 것입니다.


1

$ html_brand에 전달하는 정확한 콘텐츠는 무엇입니까?

잘못된 URL 구문이있는 경우 HTTP 코드 0이 표시 될 가능성이 큽니다.


1

이 시도:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

2
수락 된 답변으로 이전 질문에 답변 할 때 답변에서 다루는 질문의 새로운 측면을 지적하는 것이 중요합니다. 또한 코드 전용 답변은 일반적으로 작동 방법과 이유에 대한 설명을 추가하여 개선 할 수 있습니다. 또한 누군가가 보안을 비활성화 할 것을 제안 할 때 그 이유와 위험이 무엇인지 설명하는 것이 매우 중요합니다.
Jason Aller

이 코드는 질문에 답할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
Donald Duck

0

PHP가 http 코드 0을 반환하는 또 다른 이유는 시간 초과입니다. 제 경우에는 다음과 같은 구성을 가졌습니다.

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

내가 가리키는 끝점에 대한 요청은 항상 500ms 이상이 걸리고 항상 시간이 초과되고 항상 http 코드 0을 반환합니다.

이 설정 (CURLOPT_TIMEOUT_MS)을 제거하거나 더 높은 값 (제 경우에는 5000)을 입력하면 실제 http 코드, 제 경우에는 200 (예상대로)을 얻을 수 있습니다.

https://www.php.net/manual/en/function.curl-setopt.php를 참조 하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.