curl_exec () luôn trả về false


113

Tôi đã viết đoạn mã đơn giản này:

$ch = curl_init();

//Set options
curl_setopt($ch, CURLOPT_URL, "http://www.php.net");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$website_content = curl_exec ($ch);

Trong trường hợp của tôi $website_contentđến như false. Bất cứ ai có thể đề nghị / lời khuyên điều gì đó có thể xảy ra sai?


8
curl_error()Vui lòng tham khảo chi tiết lỗi và đăng những lỗi này ở đây.
Linus Kleen

@LinusKleen Nếu bạn đăng curl_error () như một câu trả lời, tôi sẽ tán thành nó vì nó cho phép tôi biết vấn đề của tôi là gì.
Giles Roberts vào

Chính xác thì vấn đề là gì? Lỗi gì đã curl_error()tiết lộ?
showdev

Câu trả lời:


241

Việc kiểm tra và xử lý lỗi là bạn của lập trình viên. Kiểm tra các giá trị trả về của các hàm cURL đang khởi tạo và thực thi. curl_error()curl_errno()sẽ chứa thêm thông tin trong trường hợp không thành công:

try {
    $ch = curl_init();

    // Check if initialization had gone wrong*    
    if ($ch === false) {
        throw new Exception('failed to initialize');
    }

    curl_setopt($ch, CURLOPT_URL, 'http://example.com/');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt(/* ... */);

    $content = curl_exec($ch);

    // Check the return value of curl_exec(), too
    if ($content === false) {
        throw new Exception(curl_error($ch), curl_errno($ch));
    }

    /* Process $content here */

    // Close curl handle
    curl_close($ch);
} catch(Exception $e) {

    trigger_error(sprintf(
        'Curl failed with error #%d: %s',
        $e->getCode(), $e->getMessage()),
        E_USER_ERROR);

}

* Các curl_init() thủ quốc gia:

Trả về một xử lý cURL khi thành công, FALSE nếu có lỗi.

Tôi đã quan sát thấy hàm trả về FALSEkhi bạn đang sử dụng $urltham số của nó và miền không thể được giải quyết. Nếu tham số không được sử dụng, hàm có thể không bao giờ trả về FALSE. Tuy nhiên, hãy luôn kiểm tra nó vì sách hướng dẫn không nêu rõ ràng "lỗi" thực sự là gì.


9
+1: Xử lý sự cố đơn giản và dễ hiểu cho curl trong PHP khi curl_exectrả về FALSE. - Chế độ Curl Verbose trong ví dụ PHP
hakre

vâng. Thực sự đã tìm ra điều này từ lâu. Cảm ơn cho câu trả lời mặc dù :)
Adithya

7
Không vấn đề gì. Đã nhận được huy hiệu Hồi sinh cho nó :-) Cảm ơn bạn đã chấp nhận.
Linus Kleen

@marverix tốt, tên của ông là Linus: P
Nino Škopac

và đừng quên curl_close ($ ch);
Rafik Bari

10

Trong trường hợp của tôi, tôi cần phải thiết lập VERIFYHOSTVERIFYPEERđến false, như thế này:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

trước cuộc gọi tới curl_exec($ch).

Bởi vì tôi đang làm việc giữa hai môi trường phát triển với các chứng chỉ tự gán. Với giấy chứng nhận hợp lệ không có nhu cầu để thiết lập VERIFYHOSTVERIFYPEERđến falsecurl_exec($ch)phương pháp sẽ làm việc và trả lại phản ứng bạn mong đợi.


Điều này thực sự hữu ích cho tôi. Cảm ơn vì tiền hỗ trợ!
n8jadams,

3

Điều này đã xảy ra với tôi ngày hôm qua và trong trường hợp của tôi là do tôi đang làm theo hướng dẫn sử dụng PDF để phát triển một số mô-đun để giao tiếp với API và trong khi sao chép liên kết trực tiếp từ hướng dẫn đó, vì một số lý do kỳ lạ, hyphenliên kết từ liên kết được sao chép khác mã hóa và do đó curl_exec()luôn trả về falsevì nó không thể giao tiếp với máy chủ.

Tôi đã mất vài giờ để cuối cùng hiểu được sự khác biệt trong các ký tự dưới đây:

https://www.e‐example.com/api
https://www.e-example.com/api

Mỗi khi tôi cố gắng truy cập liên kết trực tiếp từ trình duyệt, nó đã chuyển đổi thành một cái gì đó giống như vậy https://www.xn--eexample-0m3d.com/api.

Đối với bạn, có vẻ như chúng bằng nhau nhưng nếu bạn kiểm tra bảng mã của cái hyphens ở đây, bạn sẽ thấy rằng cái đầu tiên hyphenlà ký tự unicode U + 2010 và cái còn lại là U + 002D .

Hy vọng điều này sẽ giúp ai đó.

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.