PHP cURL HTTP CODE retourne 0

95

Je ne comprends pas quand j'écho $ httpCode J'obtiens toujours 0, je m'attendais à 404 quand je change $ html_brand en une URL cassée. Y a-t-il quelque chose que je rate ou que je ne sais pas? Merci.

 //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
la source

Réponses:

95

Si vous vous connectez au serveur, vous pouvez obtenir un code de retour de celui-ci, sinon il échouera et vous obtiendrez un 0. Donc, si vous essayez de vous connecter à "www.google.com/lksdfk", vous obtiendrez un code de retour de 400, si vous allez directement sur google.com, vous obtiendrez 302 (puis 200 si vous passez à la page suivante ... eh bien je le fais car il redirige vers google.com.br, donc vous risquez de ne pas l'obtenir), et si vous allez sur "googlecom" vous obtiendrez un 0 (hôte non trouvé), donc avec le dernier, il n'y a personne pour renvoyer un code.

Testé à l'aide du code ci-dessous.

<?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);
crâne vide
la source
1
Aussi merci pour le référencement de followlocation aussi, parfois je reçois 301 qui est un problème de redirection.
Ardeus
C'est bizarre même si $ response a un contenu html, mais le $ httpcode renvoie toujours 0, plus curl_error est nul. ce qui était possible a mal tourné. J'inclus uniquement returntransfer, header (false), followlocation dans le paramètre uniquement.
Ardeus
Juste pour ajouter, s'il y a des espaces avant ou après l'URL, il lancera également le http_code = 0
Raja Amer Khan
80

Essayez ceci après curl_exec pour voir quel est le problème:

print curl_error($ch);

S'il est imprimé quelque chose comme «malformé», vérifiez le format de votre URL.

Hereblur
la source
5
Merci pour cette suggestion - sauvé mes fesses :)
wbj
OUI! J'ai sauvé mon cul.
pimbrouwers
5

vérifiez le curl_error après le curl_getinfo pour découvrir les erreurs cachées.

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

Comme dit ici et ci-dessous, une requête échouée ( c'est-à-dire que le serveur n'est pas trouvé ) retourne false, pas de code d'état HTTP, puisqu'une réponse n'a jamais été reçue.

Appelez curl_error().

CodeCaster
la source
2

J'ai eu le même problème et dans mon cas, c'était parce que la fonction curl_exec est désactivée dans php.ini. Vérifiez les journaux:

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

La solution consiste à supprimer curl_exec des fonctions désactivées dans php.ini sur le fichier de configuration du serveur.

Gondy
la source
1

Quel est le contenu exact que vous transmettez à $ html_brand?

Si la syntaxe d'URL est invalide, vous obtiendrez très probablement le code HTTP 0.

Psynnott
la source
1

Essaye ça:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Meldo
la source
2
Lorsque vous répondez à une question plus ancienne avec une réponse acceptée, il est important d'indiquer à quel nouvel aspect de la question votre réponse traite. De plus, les réponses codées uniquement peuvent généralement être améliorées en ajoutant des explications sur comment et pourquoi elles fonctionnent. Aussi, lorsque vous suggérez à quelqu'un de désactiver la sécurité, il est TRÈS important d'expliquer pourquoi et quels sont les risques.
Jason Aller
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la façon et / ou pourquoi il résout le problème améliorerait la valeur à long terme de la réponse.
Donald Duck
0

Une autre raison pour laquelle PHP renvoie le code http 0 est le timeout. Dans mon cas, j'avais la configuration suivante:

curl_setopt ($ http, CURLOPT_TIMEOUT_MS, 500);

Il s'est avéré que la demande au point final vers lequel je pointais prenait toujours plus de 500 ms, expirait toujours et retournait toujours le code http 0.

Si vous supprimez ce paramètre (CURLOPT_TIMEOUT_MS) ou mettez une valeur plus élevée (dans mon cas 5000), vous obtiendrez le code http réel, dans mon cas un 200 (comme prévu).

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

Alejandro Hdez. Angeles
la source