PHP cURL HTTP CODE ส่งคืน 0


97

ฉันไม่เข้าใจเมื่อฉัน echo $ httpCode ฉันมักจะได้ 0 ฉันคาดหวังว่า 404 เมื่อฉันเปลี่ยน $ html_brand เป็น url ที่ใช้งานไม่ได้ มีอะไรที่ฉันพลาดหรือไม่รู้จัก? ขอบคุณ.

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

คำตอบ:


96

หากคุณเชื่อมต่อกับเซิร์ฟเวอร์คุณจะได้รับรหัสส่งคืนจากเซิร์ฟเวอร์มิฉะนั้นจะล้มเหลวและคุณจะได้รับ 0 ดังนั้นหากคุณพยายามเชื่อมต่อกับ "www.google.com/lksdfk" คุณจะได้รับรหัสส่งคืนเป็น 400 ถ้าคุณไปที่ google.com โดยตรงคุณจะได้รับ 302 (แล้ว 200 ถ้าคุณส่งต่อไปยังหน้าถัดไป ... ฉันทำได้ดีเพราะส่งต่อไปที่ google.com.br ดังนั้นคุณอาจไม่เข้าใจ) และถ้าคุณไปที่ "googlecom" คุณจะได้รับ 0 (ไม่พบโฮสต์) ดังนั้นสุดท้ายจะไม่มีใครส่งรหัสกลับมา

ทดสอบโดยใช้รหัสด้านล่าง

<?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
ขอขอบคุณสำหรับการพิจารณาตำแหน่งติดตามด้วยเช่นกันบางครั้งฉันได้รับ 301 ซึ่งเป็นปัญหาในการเปลี่ยนเส้นทาง
Ardeus

มันแปลกแม้ว่า $ response จะมีเนื้อหา html แต่ $ httpcode จะคืนค่า 0 เสมอบวก curl_error เป็นโมฆะ สิ่งที่เป็นไปได้ผิดพลาด ฉันรวมเฉพาะ returntransfer, header (false), followlocation ในการตั้งค่าเท่านั้น
Ardeus

หากต้องการเพิ่มหากมีช่องว่างก่อนหรือหลัง URL ก็จะโยน http_code = 0
Raja Amer Khan


84

ลองใช้สิ่งนี้หลังจาก curl_exec เพื่อดูว่ามีปัญหาอะไร:

print curl_error($ch);

หากมีการพิมพ์บางอย่างเช่น "ผิดรูปแบบ" ให้ตรวจสอบรูปแบบ URL ของคุณ


5
ขอบคุณสำหรับคำแนะนำ - บันทึกก้นของฉัน :)
wbj

ใช่! บันทึกลาของฉัน
PIM


2

ตามที่กล่าวไว้ที่นี่และด้านล่างคำขอที่ล้มเหลว ( เช่นไม่พบเซิร์ฟเวอร์ ) จะส่งคืนเท็จไม่มีรหัสสถานะ HTTP เนื่องจากไม่เคยได้รับการตอบกลับ

โทรcurl_error().


2

ฉันมีปัญหาเดียวกันและในกรณีของฉันนี่เป็นเพราะฟังก์ชัน curl_exec ถูกปิดใช้งานใน php.ini ตรวจสอบบันทึก:

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

โซลูชันคือลบ curl_exec ออกจากฟังก์ชันที่ปิดใช้งานใน php.ini บนไฟล์คอนฟิกูเรชันของเซิร์ฟเวอร์


1

อะไรคือเนื้อหาที่แน่นอนที่คุณส่งผ่านไปยัง $ html_brand?

หากมีไวยากรณ์ URL ที่ไม่ถูกต้องคุณจะได้รับรหัส HTTP 0


1

ลองสิ่งนี้:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

3
เมื่อตอบคำถามที่เก่ากว่าด้วยคำตอบที่เป็นที่ยอมรับสิ่งสำคัญคือต้องชี้ให้เห็นว่าคำถามของคุณอยู่ในแง่มุมใหม่ใด นอกจากนี้รหัสคำตอบเท่านั้นที่สามารถปรับปรุงได้โดยการเพิ่มคำอธิบายวิธีการทำงานและเหตุผล นอกจากนี้เมื่อแนะนำให้ใครบางคนปิดการใช้งานความปลอดภัยสิ่งสำคัญอย่างยิ่งที่จะต้องอธิบายว่าเหตุใดและความเสี่ยงคืออะไร
Jason Aller

แม้ว่ารหัสนี้อาจตอบคำถามได้ แต่การให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือเหตุผลในการแก้ปัญหาจะช่วยเพิ่มมูลค่าในระยะยาวของคำตอบ
Donald Duck

0

อีกเหตุผลหนึ่งที่ทำให้ PHP ส่งคืนรหัส http 0 คือการหมดเวลา ในกรณีของฉันฉันมีการกำหนดค่าต่อไปนี้:

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

ปรากฎว่าคำขอไปยังปลายทางที่ฉันชี้ไปมักจะใช้เวลามากกว่า 500 มิลลิวินาทีหมดเวลาและส่งคืนรหัส http 0 เสมอ

หากคุณลบการตั้งค่านี้ (CURLOPT_TIMEOUT_MS) หรือใส่ค่าที่สูงกว่า (ในกรณีของฉันคือ 5000) คุณจะได้รับรหัส http จริงในกรณีของฉันคือ 200 (ตามที่คาดไว้)

ดูhttps://www.php.net/manual/en/function.curl-setopt.php


0

หากคุณใช้ Selinux อาจเป็นเพราะข้อ จำกัด ด้านความปลอดภัย ลองตั้งค่านี้เป็นรูท:

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