79 votes

Comment résoudre l'erreur cURL (7) : couldn't connect to host ?

J'envoie un code d'article à un service web au format xml en utilisant cURL(php). J'obtiens la réponse correcte en localhost, mais quand je le fais sur le serveur il montre

Erreur cURL (7) : Impossible de se connecter à l'hôte.

Et voici mon code :

function xml_post($post_xml, $url)
{
    $user_agent = $_SERVER['HTTP_USER_AGENT'];

    $ch = curl_init();    // initialize curl handle
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);          
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 50); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_xml); 
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
//  curl_setopt($ch, CURLOPT_PORT, $port);          

    $data = curl_exec($ch);
    $curl_errno = curl_errno($ch);
    $curl_error = curl_error($ch);
    if ($curl_errno > 0) {
            echo "cURL Error ($curl_errno): $curl_error\n";
    } else {
            echo "Data received\n";
    }
    curl_close($ch);

    echo $data;
}

J'envoie le code de l'article au Tally et je récupère les détails à partir de celui-ci. J'ai essayé d'utiliser les deux versions de php 4+ et php5+, mais rien ne fonctionne Aucune solution.

0 votes

Choisissez un proxy qui utilise un port 80

0 votes

Utiliser l'option curl verbose pour obtenir plus d'informations

0 votes

J'ajouterai deux choses ici qui ont finalement permis de résoudre mon problème : 1. exécuter cURL à partir de la ligne de commande avec --verbose 2. Si vous êtes sous OSX avec Little Snitch (ou similaire), regardez ça.

0voto

cfynes Points 33

Pendant quelques jours, j'étais totalement bloqué sur ce sujet. Je suis très novice en matière de réseaux/vms mais j'avais envie d'essayer de le mettre en place moi-même au lieu de payer un hébergeur pour le faire à ma place.

Contexte

Je suis en train de reconstruire le côté serveur d'une application qui utilise des routines php pour renvoyer divers éléments de données provenant de sources internes ainsi que d'API externes pour une application basée sur une carte. J'ai démarré une instance Oracle VM et j'ai installé/configuré Apache et php. Tout fonctionne parfaitement, jusqu'à ce qu'une de mes routines php tente d'exécuter un cURL. Je commence à mettre en œuvre la journalisation des erreurs pour constater que je ne reçois même pas de message - juste '7', malgré une mise en œuvre très similaire à celle décrite ci-dessus. Ma routine php accédant à un fichier interne pour les données s'exécutait correctement, j'étais donc presque sûr qu'il ne s'agissait pas d'un problème Apache ou php. J'ai également vérifié mes journaux d'erreurs Apache, rien de révélateur.

Solution

J'ai failli abandonner - il est question de désactiver SELinux ci-dessus et dans d'autres articles, j'ai essayé et c'est a fait travail pour mes besoins, mais voici un très bon article sur les raisons pour lesquelles vous ne devrait pas désactiver SELinux https://www.electronicdesign.com/technologies/embedded-revolution/article/21807408/dont-do-it-disabling-selinux

Si la désactivation temporaire fonctionne et que, comme moi, vous ne voulez pas le faire (mais cela confirme que SELinux vous bloque !), j'ai trouvé une petite commande soignée qui affiche les problèmes SELinux d'une manière plus lisible :

sealert -a /var/log/audit/audit.log

Le résultat est le suivant :

found 1 alerts in /var/log/audit/audit.log
--------------------------------------------------------------------------------

SELinux is preventing php-fpm from name_connect access on the tcp_socket port 443.

Super, j'ai maintenant un peu plus d'informations que juste '7'. En lisant plus bas, je peux voir qu'il fait des suggestions :

*****  Plugin catchall_boolean (24.7 confidence) suggests   ******************

If you want to allow httpd to can network connect
Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean.

Do
setsebool -P httpd_can_network_connect 1

Cela a été mentionné plus haut mais maintenant j'ai un peu plus de contexte et une explication de ce que cela fait. J'exécute la commande, et c'est parti. De plus, mon SELinux est toujours réglé sur enforcing, ce qui signifie que ma machine est plus sûre.

Il y a beaucoup d'autres suggestions de déconnexion, si vous êtes bloqué, cela peut valoir la peine de se déconnecter/vérifier /var/log/audit/audit.log.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X