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

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

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.


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

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().


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.


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.


1

Essaye ça:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.