PHP cURL HTTP CODE mengembalikan 0

95

Saya tidak mengerti ketika saya echo $ httpCode Saya selalu mendapatkan 0, saya mengharapkan 404 ketika saya mengubah $ html_brand menjadi url rusak. Apakah ada sesuatu yang saya lewatkan atau tidak saya ketahui? Terima kasih.

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

Jawaban:

95

Jika Anda terhubung dengan server, maka Anda bisa mendapatkan kode pengembalian darinya, jika tidak maka akan gagal dan Anda mendapatkan 0. Jadi jika Anda mencoba menyambung ke "www.google.com/lksdfk" Anda akan mendapatkan kode pengembalian 400, jika Anda pergi langsung ke google.com, Anda akan mendapatkan 302 (dan kemudian 200 jika Anda meneruskan ke halaman berikutnya ... baik saya lakukan karena meneruskan ke google.com.br, jadi Anda mungkin tidak mendapatkannya), dan jika Anda pergi ke "googlecom" Anda akan mendapatkan 0 (host tidak ditemukan), jadi dengan yang terakhir, tidak ada orang yang mengirim kode kembali.

Diuji menggunakan kode di bawah ini.

<?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);
tengkorak kosong
sumber
1
Juga terima kasih untuk referensi followlocation juga, kadang-kadang saya mendapatkan 301 yang merupakan masalah pengalihan.
Ardeus
Anehnya meskipun $ response memiliki konten html, tetapi $ httpcode selalu mengembalikan 0, ditambah curl_error adalah null. apa yang mungkin salah. Saya hanya menyertakan returntransfer, header (false), followlocation di setting saja.
Ardeus
Sebagai tambahan, jika ada spasi sebelum atau sesudah URL, itu juga akan menampilkan http_code = 0
Raja Amer Khan
80

Coba ini setelah curl_exec untuk melihat apa masalahnya:

print curl_error($ch);

Jika itu mencetak sesuatu seperti 'cacat' kemudian periksa format URL Anda.

Hereblur
sumber
5
Terima kasih atas saran itu - menyelamatkan pantat saya :)
wbj
IYA! Menyelamatkan pantatku.
pimbrouwers
5

periksa curl_error setelah curl_getinfo untuk mengetahui kesalahan tersembunyi.

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

Seperti yang dikatakan di sini dan di bawah ini, permintaan yang gagal ( yaitu server tidak ditemukan ) mengembalikan false, tidak ada kode status HTTP, karena balasan tidak pernah diterima.

Panggil curl_error().

CodeCaster
sumber
2

Saya memiliki masalah yang sama dan dalam kasus saya ini karena fungsi curl_exec dinonaktifkan di php.ini. Periksa log:

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

Solusinya adalah menghapus curl_exec dari fungsi yang dinonaktifkan di php.ini pada file konfigurasi server.

Gondy
sumber
1

Apa persisnya konten yang Anda berikan ke $ html_brand?

Jika memiliki sintaks URL yang tidak valid, kemungkinan besar Anda akan mendapatkan kode HTTP 0.

psynnott.dll
sumber
1

Coba ini:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Meldo
sumber
2
Saat menjawab pertanyaan lama dengan jawaban yang diterima, penting untuk menunjukkan aspek baru apa dari pertanyaan yang dijawab oleh jawaban Anda. Juga jawaban kode saja umumnya dapat ditingkatkan dengan menambahkan beberapa penjelasan tentang bagaimana dan mengapa mereka bekerja. Juga ketika menyarankan agar seseorang menonaktifkan keamanan, SANGAT penting untuk menjelaskan mengapa dan apa risikonya.
Jason Aller
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa kode ini memecahkan masalah akan meningkatkan nilai jawaban jangka panjang.
Donald Duck
0

Alasan lain PHP mengembalikan kode http 0 adalah batas waktu. Dalam kasus saya, saya memiliki konfigurasi berikut:

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

Ternyata request ke endpoint yang saya tunjuk selalu membutuhkan waktu lebih dari 500 ms, selalu time out dan selalu mengembalikan kode http 0.

Jika Anda menghapus pengaturan ini (CURLOPT_TIMEOUT_MS) atau memberikan nilai yang lebih tinggi (dalam kasus saya 5000), Anda akan mendapatkan kode http yang sebenarnya, dalam kasus saya 200 (seperti yang diharapkan).

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

Alejandro Hdez. Angeles
sumber
0

Jika Anda menggunakan selinux, itu mungkin karena batasan keamanan. Coba atur ini sebagai root:

# setsebool -P httpd_can_network_connect on
Samo
sumber