curl을 사용하여 PHP에서 HTTP 코드 가져 오기


177

CURL을 사용하여 사이트가 작동 / 중지되거나 다른 사이트로 리디렉션되는 경우 상태를 가져옵니다. 가능한 한 간소화하고 싶지만 제대로 작동하지 않습니다.

<?php
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_TIMEOUT,10);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

return $httpcode;
?>

나는 이것을 함수로 감쌌다. 잘 작동하지만 전체 페이지를 다운로드하기 때문에 성능이 가장 좋지 않습니다. 제거 $output = curl_exec($ch);하면 0항상 반환 됩니다.

누구든지 성능을 향상시키는 방법을 알고 있습니까?

답변:


260

먼저 URL이 실제로 유효한지 확인하십시오 (문자열, 비어 있지 않은, 좋은 구문). 이것은 서버 측을 빠르게 확인하는 것입니다. 예를 들어,이 작업을 먼저 수행하면 많은 시간을 절약 할 수 있습니다.

if(!$url || !is_string($url) || ! preg_match('/^http(s)?:\/\/[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i', $url)){
    return false;
}

본문 내용이 아닌 헤더 만 가져와야합니다.

@curl_setopt($ch, CURLOPT_HEADER  , true);  // we want headers
@curl_setopt($ch, CURLOPT_NOBODY  , true);  // we don't need body

URL 상태 http 코드를 얻는 방법에 대한 자세한 내용은 내가 작성한 다른 게시물을 참조하십시오 (다음 리디렉션에도 도움이 됨).


전체적으로:

$url = 'http://www.example.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, true);    // we want headers
curl_setopt($ch, CURLOPT_NOBODY, true);    // we don't need body
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo 'HTTP code: ' . $httpcode;

4
귀하의 게시물을 편집하고 작업 예제 코드를 전체적으로 붙여 넣었습니다. 나는이 방법이 더 도움이된다는 것을 알았습니다. BURL., CURLOPT_HEADER 및 CURLOPT_NOBODY 설정을 언급 한 +1! :)
Sk8erPeter

25
CURLOPT_HEADER를 true로 설정할 필요는 없습니다. curl_getinfo ()에서 여전히 httpcode를 얻습니다.
Brainware

7
PHP 5.5.0 및 cURL 7.10.8에서이 [CURLINFO_HTTP_CODE]는 CURLINFO_RESPONSE_CODE ( ref ) 의 레거시 별명입니다.
sshow

어떤 이유로이 줄 curl_setopt($ch, CURLOPT_NOBODY, true);이 걸려 있습니다. 이것이 서버의 PHP 버전과 관련이 있는지 확실하지 않습니다.
itoctopus

126
// must set $url first....
$http = curl_init($url);
// do your curl thing here
$result = curl_exec($http);
$http_status = curl_getinfo($http, CURLINFO_HTTP_CODE);
curl_close($http);
echo $http_status;

16
이것은 가장 직접적인 답변입니다
Enigma Plus

6
이것은 몸을 무시할 필요가 없으며 한 번만 전화를 걸면 선호하는 대답이됩니다.
Mike_K

24
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$rt = curl_exec($ch);
$info = curl_getinfo($ch);
echo $info["http_code"];

1
타입을 만들면 echo $ info [ "http_code"]; echo 대신 $ info [ "http_code];
기록 끄기

16

PHP의 " get_headers "기능을 사용해보십시오 .

다음과 같은 내용이 있습니다.

<?php
    $url = 'http://www.example.com';
    print_r(get_headers($url));
    print_r(get_headers($url, 1));
?>

컬에 비해 헤더 가져 오기가 느립니다.
Mike Kormendy

4

curl_getinfo — 특정 전송에 관한 정보를 얻습니다

curl_getinfo 확인

<?php
// Create a curl handle
$ch = curl_init('http://www.yahoo.com/');

// Execute
curl_exec($ch);

// Check if any error occurred
if(!curl_errno($ch))
{
 $info = curl_getinfo($ch);

 echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
}

// Close handle
curl_close($ch);

2

curl_exec필수적이다. 시도 CURLOPT_NOBODY몸을 다운로드 할 수 있습니다. 더 빠를 수도 있습니다.


0

function getStatusCode()
{
    $url = 'example.com/test';
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, true);    // we want headers
    curl_setopt($ch, CURLOPT_NOBODY, true);    // we don't need body
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_TIMEOUT,10);
    $output = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return  $httpcode;
}
print_r(getStatusCode());

0

hitCurl 메소드를 사용하여 모든 유형의 API 응답을 가져옵니다 (예 : Get / Post).

        function hitCurl($url,$param = [],$type = 'POST'){
        $ch = curl_init();
        if(strtoupper($type) == 'GET'){
            $param = http_build_query((array)$param);
            $url = "{$url}?{$param}";
        }else{
            curl_setopt_array($ch,[
                CURLOPT_POST => (strtoupper($type) == 'POST'),
                CURLOPT_POSTFIELDS => (array)$param,
            ]);
        }
        curl_setopt_array($ch,[
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
        ]);
        $resp = curl_exec($ch);
        $statusCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
        curl_close($ch);
        return [
            'statusCode' => $statusCode,
            'resp' => $resp
        ];
    }

API 테스트를위한 데모 기능

 function fetchApiData(){
        $url = 'https://postman-echo.com/get';
        $resp = $this->hitCurl($url,[
            'foo1'=>'bar1',
            'foo2'=>'bar2'
        ],'get');
        $apiData = "Getting header code {$resp['statusCode']}";
        if($resp['statusCode'] == 200){
            $apiData = json_decode($resp['resp']);
        }
        echo "<pre>";
        print_r ($apiData);
        echo "</pre>";
    }

-3

내 솔루션은 정기적으로 서버 상태를 확인하기 위해 Status Http를 가져와야합니다.

$url = 'http://www.example.com'; // Your server link

while(true) {

    $strHeader = get_headers($url)[0];

    $statusCode = substr($strHeader, 9, 3 );

    if($statusCode != 200 ) {
        echo 'Server down.';
        // Send email 
    }
    else {
        echo 'oK';
    }

    sleep(30);
}

1
Getheaders는 curl에 비해 느립니다.
Mike Kormendy

1
왜 휴면 및 무한 루프를 사용하는 대신 cron 또는 webhook을 사용하지 않습니까?
Ugur Kazdal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.