PHP cURL HTTP KODU dönüş 0


97

$ HttpCode'u yankıladığımda anlamıyorum, her zaman 0 alıyorum, $ html_brand'ı bozuk bir url'ye çevirdiğimde 404 bekliyordum. Özlediğim veya bilmediğim bir şey var mı? Teşekkürler.

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

Yanıtlar:


96

Sunucuya bağlanırsanız, ondan bir dönüş kodu alabilirsiniz, aksi takdirde başarısız olur ve 0 alırsınız. Dolayısıyla, "www.google.com/lksdfk" adresine bağlanmaya çalışırsanız, bir dönüş kodu alırsınız. 400, doğrudan google.com'a giderseniz, 302 alırsınız (ve sonraki sayfaya yönlendirirseniz 200 ... iyi yaparım çünkü o google.com.br'a yönlendirir, bu yüzden alamayabilirsiniz), ve "googlecom" a giderseniz, 0 alırsınız (ana bilgisayar bulunamadı), bu nedenle sonuncusunda, kodu geri gönderecek kimse yoktur.

Aşağıdaki kod kullanılarak test edilmiştir.

<?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
Ayrıca followlocation'ı yeniden düzenlemek için teşekkürler, bazen yeniden yönlendirme sorunu olan 301'i alıyorum.
Ardeus

$ Response'un html içeriğine sahip olmasına rağmen tuhaftır, ancak $ httpcode her zaman 0 döndürür, artı curl_error boştur. mümkün olan ne yanlış gitti. Ayara yalnızca returntransfer, header (false), followlocation ekliyorum.
Ardeus

URL'den önce veya sonra boşluklar varsa eklemek için http_code = 0
Raja Amer Khan


84

Sorunun ne olduğunu görmek için curl_exec'den sonra bunu deneyin:

print curl_error($ch);

'Bozuk' gibi bir şey yazdırıyorsa, URL biçiminizi kontrol edin.


5
Bu öneri için teşekkürler - popomu kurtardı :)
wbj

EVET! Kıçımı kurtardım.
pim

5

gizli hataları bulmak için curl_getinfo'dan sonra curl_error'u kontrol edin .

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

2

Gibi söz konusu burada (başarısız bir istek ve aşağıda sunucu bulunamazsa yani ) false döndürür, hiçbir HTTP durum kodu, yanıt alındığında olmamıştı çünkü.

Çağrı curl_error().


2

Aynı problemi yaşadım ve benim durumumda bunun nedeni curl_exec işlevinin php.ini'de devre dışı bırakılmasıydı. Günlükleri kontrol edin:

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

Çözüm curl_exec'i sunucu yapılandırma dosyasında php.ini'deki devre dışı bırakılmış işlevlerden kaldırmaktır.


1

$ Html_brand'a aktardığınız içerik tam olarak nedir?

Geçersiz bir URL sözdizimine sahipse, büyük olasılıkla HTTP kodunu 0 alırsınız.


1

Bunu dene:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

3
Eski bir soruyu kabul edilmiş bir cevapla cevaplarken, cevabınızın hangi yeni soruyu ele aldığını belirtmek önemlidir. Ayrıca yalnızca kod yanıtları, genellikle nasıl ve neden çalıştıklarına ilişkin bazı açıklamalar eklenerek geliştirilebilir. Ayrıca birisine güvenliği devre dışı bırakmasını önerirken risklerin neden ve ne olduğunu açıklamak ÇOK önemlidir.
Jason Aller

Bu kod soruyu yanıtlayabilirken, sorunun nasıl ve / veya neden çözüldüğüne ilişkin ek bağlam sağlamak, yanıtlayanın uzun vadeli değerini artıracaktır.
Ördek Donald

0

PHP'nin http kodunu 0 döndürmesinin bir başka nedeni de zaman aşımıdır. Benim durumumda aşağıdaki konfigürasyona sahiptim:

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

İşaret ettiğim uç noktaya yönelik isteğin her zaman 500 ms'den fazla sürdüğü, her zaman zaman aşımına uğradığı ve her zaman http kodunu 0 döndürdüğü ortaya çıktı.

Bu ayarı kaldırırsanız (CURLOPT_TIMEOUT_MS) veya daha yüksek bir değer koyarsanız (benim durumumda 5000), benim durumumda bir 200 (beklendiği gibi) gerçek http kodunu alırsınız.

Bkz. Https://www.php.net/manual/en/function.curl-setopt.php


0

Selinux kullanıyorsanız, bunun nedeni güvenlik kısıtlamaları olabilir. Bunu kök olarak ayarlamayı deneyin:

# setsebool -P httpd_can_network_connect on
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.