Lấy mã HTTP trong PHP bằng cách sử dụng curl


177

Tôi đang sử dụng CURL để nhận trạng thái của một trang, nếu nó lên / xuống hoặc chuyển hướng đến một trang khác. Tôi muốn làm cho nó được sắp xếp hợp lý nhất có thể, nhưng nó không hoạt động tốt.

<?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;
?>

Tôi có cái này được bọc trong một chức năng. Nó hoạt động tốt nhưng hiệu suất không phải là tốt nhất vì nó tải xuống toàn bộ trang, điều mà nếu tôi xóa $output = curl_exec($ch);nó sẽ trả về 0mọi lúc.

Có ai biết làm thế nào để thực hiện tốt hơn?

Câu trả lời:


261

Trước tiên, hãy đảm bảo nếu URL thực sự hợp lệ (một chuỗi, không trống, cú pháp tốt), điều này nhanh chóng để kiểm tra phía máy chủ. Ví dụ, làm điều này đầu tiên có thể tiết kiệm rất nhiều thời gian:

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

Đảm bảo bạn chỉ tìm nạp các tiêu đề, không phải nội dung cơ thể:

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

Để biết thêm chi tiết về cách nhận mã http trạng thái URL, tôi tham khảo một bài đăng khác tôi đã thực hiện (nó cũng giúp với các chuyển hướng sau):


Nhìn chung:

$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
Tôi đã chỉnh sửa bài viết của bạn và dán toàn bộ mã ví dụ làm việc. Tôi thấy nó theo cách này hữu ích hơn. Btw., +1 để đề cập đến các cài đặt CURLOPT_HEADER và CURLOPT_NOBODY! :)
Sk8erPeter

25
Không cần thiết phải đặt CURLOPT_HEADER thành true. Bạn vẫn nhận được httpcode từ curl_getinfo ().
Brainware

7
Kể từ phiên bản PHP 5.5.0 và cURL 7.10.8, [CURLINEFO_HTTP_CODE] này là bí danh kế thừa của CURLINEFO_RESPONSE_CODE ( ref )
sshow

Đối với một số lý do dòng curl_setopt($ch, CURLOPT_NOBODY, true);này được treo. Không chắc chắn nếu điều này có liên quan đến phiên bản PHP của máy chủ.
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
Đây là câu trả lời trực tiếp nhất cho câu hỏi
Enigma Plus

6
Điều này không yêu cầu bỏ qua cơ thể và chỉ thực hiện một cuộc gọi, làm cho nó là câu trả lời ưa thích của tôi là tốt.
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
bạn đã tạo một loại, nó sẽ là echo $ thông tin ["http_code"]; thay vì echo $ thông tin ["http_code];
Ludo - Tắt bản ghi

16

Hãy thử chức năng " get_headers " của PHP .

Một cái gì đó dọc theo dòng:

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

Nhận tiêu đề là chậm so với curl.
Mike Kormendy

4

curl_getinfo - Nhận thông tin về chuyển khoản cụ thể

Kiểm tra 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_execlà cần thiết. Cố gắng CURLOPT_NOBODYkhông tải về cơ thể. Điều đó có thể nhanh hơn.


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

sử dụng phương thức hitCurl này để tìm nạp tất cả các loại phản hồi api tức là Nhận / Đăng

        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
        ];
    }

Chức năng demo để kiểm tra 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

Đây là giải pháp của tôi cần lấy Status http để kiểm tra trạng thái máy chủ thường xuyên

$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 chậm so với curl.
Mike Kormendy

1
Tại sao bạn không sử dụng cron hoặc webhook thay vì sử dụng giấc ngủ và vòng lặp vô tận?
Ugur Kazdal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.