curl_exec () selalu mengembalikan nilai salah


114

Saya telah menulis kode sederhana ini:

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

Dalam kasus saya $website_contentdatang sebagai false. Adakah yang bisa menyarankan / menasihati sesuatu yang mungkin salah?


8
Konsultasikan curl_error()untuk detail kesalahan dan posting ini di sini.
Linus Kleen

@LinusKleen Jika Anda memposting curl_error () sebagai jawaban, saya akan memberi suara positif karena memungkinkan saya untuk melihat apa masalah saya.
Giles Roberts

Apa sebenarnya masalahnya? Kesalahan apa yang curl_error()terungkap?
showdev

Jawaban:


242

Kesalahan pengecekan dan penanganan adalah teman programmer. Periksa nilai yang dikembalikan dari inisialisasi dan pelaksanaan fungsi cURL. curl_error()dan curl_errno()akan berisi informasi lebih lanjut jika terjadi kegagalan:

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

}

* Buku curl_init() manual menyatakan:

Mengembalikan pegangan cURL pada kesuksesan, FALSE pada kesalahan.

Saya telah mengamati fungsi untuk kembali FALSEsaat Anda menggunakan $urlparameternya dan domain tidak dapat diselesaikan. Jika parameter tidak digunakan, fungsi tersebut mungkin tidak akan pernah kembali FALSE. Bagaimanapun, selalu periksa, karena manual tidak dengan jelas menyatakan apa sebenarnya "kesalahan" itu.


9
+1: Pemecahan masalah yang sederhana dan langsung untuk curl di PHP dengan curl_execpengembalian FALSE. - Curl Verbose Mode dalam contoh PHP
hakre

ya. Sebenarnya sudah tahu ini sejak lama. Terima kasih atas jawabannya :)
Adithya

7
Tidak masalah. Punya lencana Kebangkitan untuk itu :-) Terima kasih telah menerimanya.
Linus Kleen

@marverix well, namanya Linus: P
Nino Škopac

dan jangan lupa curl_close ($ ch);
Rafik Bari

10

Dalam kasus saya, saya perlu mengatur VERIFYHOSTdan VERIFYPEERke false, seperti ini:

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

sebelum panggilan ke curl_exec($ch).

Karena saya bekerja di antara dua lingkungan pengembangan dengan sertifikat yang ditugaskan sendiri. Dengan sertifikat yang valid, Anda tidak perlu menyetel VERIFYHOSTdan VERIFYPEERke falsekarena curl_exec($ch)metode ini akan berfungsi dan mengembalikan respons yang Anda harapkan.


Ini sebenarnya berguna bagi saya. Terima kasih atas tipnya!
n8jadams

3

Ini terjadi pada saya kemarin dan dalam kasus saya adalah karena saya mengikuti manual PDF untuk mengembangkan beberapa modul untuk berkomunikasi dengan API dan saat menyalin tautan langsung dari manual, untuk beberapa alasan aneh, hyphendari tautan yang disalin berada di tempat yang berbeda. pengkodean dan karenanya curl_exec()selalu kembalifalse karena tidak dapat berkomunikasi dengan server.

Saya butuh beberapa jam untuk akhirnya memahami perbedaan karakter di bawah ini:

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

Setiap kali saya mencoba mengakses tautan langsung dari browser, tautan itu diubah menjadi sesuatu seperti https://www.xn--eexample-0m3d.com/api.

Tampaknya bagi Anda bahwa keduanya sama tetapi jika Anda memeriksa pengkodean di hyphens sini, Anda akan melihat bahwa yang pertama hyphenadalah karakter unicode U + 2010 dan yang lainnya adalah U + 002D .

Semoga ini bisa membantu seseorang.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.