curl_exec () ส่งคืนเท็จเสมอ


115

ฉันได้เขียนโค้ดง่ายๆนี้:

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

ในกรณีของฉัน$website_contentมาเป็นfalse. ใครช่วยแนะนำ / แนะนำสิ่งที่อาจผิดพลาดได้บ้าง?


8
โปรดcurl_error()ดูรายละเอียดข้อผิดพลาดและโพสต์ที่นี่
Linus Kleen

@LinusKleen ถ้าคุณโพสต์ curl_error () เป็นคำตอบฉันจะโหวตให้เพราะมันทำให้ฉันเห็นว่าปัญหาของฉันคืออะไร
Giles Roberts

ปัญหาคืออะไรกันแน่? เกิดข้อผิดพลาดcurl_error()อะไร
showdev

คำตอบ:


242

ข้อผิดพลาดในการตรวจสอบและจัดการคือเพื่อนของโปรแกรมเมอร์ ตรวจสอบค่าส่งคืนของการเริ่มต้นและการเรียกใช้ฟังก์ชัน cURL curl_error()และcurl_errno()จะมีข้อมูลเพิ่มเติมในกรณีที่เกิดความล้มเหลว:

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

}

* curl_init() คู่มือฯ :

ส่งคืนการจัดการ cURL สำหรับความสำเร็จFALSEเมื่อข้อผิดพลาด

ฉันสังเกตเห็นว่าฟังก์ชันจะส่งคืนFALSEเมื่อคุณใช้$urlพารามิเตอร์และโดเมนไม่สามารถแก้ไขได้ ถ้าพารามิเตอร์คือไม่ได้ใช้ฟังก์ชั่นอาจจะFALSEไม่กลับมา อย่างไรก็ตามควรตรวจสอบเสมอเนื่องจากคู่มือไม่ได้ระบุอย่างชัดเจนว่า "ข้อผิดพลาด" คืออะไร


9
+1: การแก้ไขปัญหาที่ง่ายและตรงสำหรับการ curl ใน PHP เมื่อcurl_execส่งคืน FALSE - Curl Verbose Mode ในตัวอย่าง PHP
hakre

ใช่. ได้คิดย้อนกลับไปนานแล้ว ขอบคุณสำหรับคำตอบ :)
Adithya

7
ไม่มีปัญหา. มีป้ายการฟื้นฟูสำหรับมัน :-) ขอบคุณที่ยอมรับ
Linus Kleen

@marverix ดีเขาชื่อ Linus: P
Nino Škopac

และอย่าลืม curl_close ($ ch);
Rafik Bari

10

ในกรณีของฉันฉันต้องตั้งค่าVERIFYHOSTและVERIFYPEERเป็นfalseดังนี้:

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

curl_exec($ch)ก่อนที่จะเรียกร้องให้

เนื่องจากฉันกำลังทำงานระหว่างสองสภาพแวดล้อมการพัฒนากับใบรับรองที่กำหนดเอง ด้วยใบรับรองที่ถูกต้องคุณไม่จำเป็นต้องตั้งค่าVERIFYHOSTและVERIFYPEERถึงfalseเพราะcurl_exec($ch)วิธีนี้จะได้ผลและตอบกลับตามที่คุณคาดหวัง


สิ่งนี้มีประโยชน์สำหรับฉันจริงๆ ขอบคุณสำหรับทิป!
n8jadams

นี่คือวิธีแก้ปัญหาของฉัน Kudos
Turikumwe

3

สิ่งนี้เกิดขึ้นกับฉันเมื่อวานนี้และในกรณีของฉันเป็นเพราะฉันทำตามคู่มือ PDF เพื่อพัฒนาโมดูลบางอย่างเพื่อสื่อสารกับ API และในขณะที่คัดลอกลิงค์โดยตรงจากคู่มือด้วยเหตุผลแปลก ๆ บางประการhyphenจากลิงก์ที่คัดลอกมานั้นแตกต่างกัน การเข้ารหัสและด้วยเหตุนี้จึงcurl_exec()มักจะกลับมาfalseเนื่องจากไม่สามารถสื่อสารกับเซิร์ฟเวอร์ได้

ฉันใช้เวลาสองสามชั่วโมงในที่สุดจึงจะเข้าใจความแตกต่างในตัวละครร้อง:

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

https://www.xn--eexample-0m3d.com/apiเวลาที่ฉันพยายามที่จะเข้าถึงการเชื่อมโยงโดยตรงจากเบราว์เซอร์ทุกคนก็แปลงเป็นสิ่งที่ชอบ

มันอาจจะดูเหมือนกับคุณว่าพวกเขามีค่าเท่ากัน แต่ถ้าคุณตรวจสอบการเข้ารหัสของhyphens ที่นี่คุณจะเห็นว่าคนแรกที่hyphenเป็นตัวอักษร Unicode U + 2010และอื่น ๆ ที่เป็นU + 002D

หวังว่านี่จะช่วยใครบางคนได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.