PHP CODE HTTP cURL trả về 0


95

Tôi không hiểu khi lặp lại $ httpCode, tôi luôn nhận được 0, tôi đã mong đợi 404 khi tôi thay đổi $ html_brand thành một url bị hỏng. Có điều gì mà tôi nhớ hoặc không biết không? Cảm ơn.

 //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);

Câu trả lời:


95

Nếu bạn kết nối với máy chủ, thì bạn có thể nhận được mã trả lại từ máy chủ, nếu không nó sẽ không thành công và bạn nhận được điểm 0. Vì vậy, nếu bạn cố gắng kết nối với "www.google.com.vn/lksdfk", bạn sẽ nhận được mã trả về 400, nếu bạn truy cập trực tiếp vào google.com, bạn sẽ nhận được 302 (và sau đó là 200 nếu bạn chuyển tiếp đến trang tiếp theo ... tôi làm vì nó chuyển tiếp đến google.com.br, vì vậy bạn có thể không nhận được điều đó), và nếu bạn truy cập "googlecom", bạn sẽ nhận được số 0 (không tìm thấy máy chủ), vì vậy với người cuối cùng, sẽ không có ai gửi lại mã.

Đã kiểm tra bằng cách sử dụng mã bên dưới.

<?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
Ngoài ra, đối với việc chuyển hướng theo dõi quá, đôi khi tôi nhận được 301, đó là một vấn đề chuyển hướng.
Ardeus

Kỳ lạ của nó mặc dù phản hồi $ có nội dung html, nhưng $ httpcode luôn trả về 0, cộng với curl_error là null. những gì có thể xảy ra đã sai. Tôi chỉ bao gồm truyền trả lại, tiêu đề (sai), vị trí theo dõi trong cài đặt mà thôi.
Ardeus

Chỉ cần nói thêm, nếu có bất kỳ khoảng trắng nào trước hoặc sau URL, nó cũng sẽ ném ra http_code = 0
Raja Amer Khan,


80

Hãy thử điều này sau curl_exec để xem vấn đề là gì:

print curl_error($ch);

Nếu nó in thứ gì đó giống như 'không đúng định dạng' thì hãy kiểm tra định dạng URL của bạn.


5
Cảm ơn vì đề xuất đó - đã cứu mông tôi :)
wbj

ĐÚNG! Đã cứu tôi.
pimbrouwers

5

kiểm tra curl_error sau curl_getinfo để tìm ra các lỗi ẩn.

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

2

Như đã nói ở đây và bên dưới, một yêu cầu không thành công ( tức là không tìm thấy máy chủ ) trả về sai, không có mã trạng thái HTTP, vì chưa bao giờ nhận được phản hồi.

Gọi điện curl_error().


2

Tôi đã gặp vấn đề tương tự và trong trường hợp của tôi, điều này là do hàm curl_exec bị tắt trong php.ini. Kiểm tra nhật ký:

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

Giải pháp là loại bỏ curl_exec khỏi các chức năng bị vô hiệu hóa trong php.ini trên tệp cấu hình máy chủ.


1

Nội dung chính xác mà bạn đang chuyển vào $ html_brand là gì?

Nếu nó có cú pháp URL không hợp lệ, rất có thể bạn sẽ nhận được mã HTTP 0.


1

Thử cái này:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

2
Khi trả lời một câu hỏi cũ hơn với câu trả lời được chấp nhận, điều quan trọng là phải chỉ ra khía cạnh mới của câu hỏi mà câu trả lời của bạn đề cập đến. Ngoài ra, câu trả lời chỉ có mã thường có thể được cải thiện bằng cách thêm một số giải thích về cách thức và lý do tại sao chúng hoạt động. Ngoài ra, khi gợi ý rằng ai đó vô hiệu hóa bảo mật, điều RẤT quan trọng là phải giải thích tại sao và rủi ro là gì.
Jason Aller

Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh về cách và / hoặc lý do tại sao nó giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Vịt Donald

0

Một lý do khác để PHP trả về mã http 0 là thời gian chờ. Trong trường hợp của tôi, tôi có cấu hình sau:

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

Hóa ra là yêu cầu tới điểm cuối mà tôi đang trỏ tới luôn mất hơn 500 ms, luôn hết thời gian chờ và luôn trả về mã http 0.

Nếu bạn xóa cài đặt này (CURLOPT_TIMEOUT_MS) hoặc đặt giá trị cao hơn (trong trường hợp của tôi là 5000), bạn sẽ nhận được mã http thực tế, trong trường hợp của tôi là 200 (như mong đợi).

Xem https://www.php.net/manual/en/ Chức năng.curl-setopt.php

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.