2017-05-10 4 views
0

J'ai un comportement étrange de cURL.cURL: connexion refusée de PHP, mais fonctionne à partir de la ligne de commande

Lorsque je tente de faire une demande à l'aide des fonctions PHP, comme ceci:

$curl = curl_init(); 

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://<url_here>", 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_SSL_VERIFYHOST => false, 
    CURLOPT_POST => 1, 
    CURLOPT_POSTFIELDS => "<body here>", 
    CURLOPT_HTTPHEADER => array(
     "content-type: application/xml" 
    ), 
)); 

je reçois Failed to connect to <url_here> port 443: Connection refused.

Mais lorsque j'essaie de faire exactement le même appel à partir de la ligne de commande (sur le serveur, où se trouve le script PHP), j'obtiens une réponse valide. Donc, l'environnement est bon, rien ne bloque le port 443.

De plus, lorsque je lance le même code PHP sur un autre serveur, cela fonctionne également.

Est-il possible que certaines options de configuration PHP empêchent cURL de fonctionner? Ou devrais-je vérifier autre chose?

Merci.


sortie des locaux curl_version():

array(9) { 
    ["version_number"]=> 
    int(470784) 
    ["age"]=> 
    int(3) 
    ["features"]=> 
    int(968605) 
    ["ssl_version_number"]=> 
    int(0) 
    ["version"]=> 
    string(6) "7.47.0" 
    ["host"]=> 
    string(19) "x86_64-pc-linux-gnu" 
    ["ssl_version"]=> 
    string(14) "OpenSSL/1.0.2g" 
    ["libz_version"]=> 
    string(5) "1.2.8" 
    ["protocols"]=> 
    array(21) { 
    [0]=> 
    string(4) "dict" 
    [1]=> 
    string(4) "file" 
    [2]=> 
    string(3) "ftp" 
    [3]=> 
    string(4) "ftps" 
    [4]=> 
    string(6) "gopher" 
    [5]=> 
    string(4) "http" 
    [6]=> 
    string(5) "https" 
    [7]=> 
    string(4) "imap" 
    [8]=> 
    string(5) "imaps" 
    [9]=> 
    string(4) "ldap" 
    [10]=> 
    string(5) "ldaps" 
    [11]=> 
    string(4) "pop3" 
    [12]=> 
    string(5) "pop3s" 
    [13]=> 
    string(4) "rtmp" 
    [14]=> 
    string(4) "rtsp" 
    [15]=> 
    string(3) "smb" 
    [16]=> 
    string(4) "smbs" 
    [17]=> 
    string(4) "smtp" 
    [18]=> 
    string(5) "smtps" 
    [19]=> 
    string(6) "telnet" 
    [20]=> 
    string(4) "tftp" 
    } 
} 

sortie des locaux curl -V:

curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3 
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets 

Sortie de curl_version() du serveur:

array(9) { 
    ["version_number"]=> 
    int(462597) 
    ["age"]=> 
    int(2) 
    ["features"]=> 
    int(1597) 
    ["ssl_version_number"]=> 
    int(0) 
    ["version"]=> 
    string(6) "7.15.5" 
    ["host"]=> 
    string(23) "x86_64-redhat-linux-gnu" 
    ["ssl_version"]=> 
    string(15) " OpenSSL/0.9.8b" 
    ["libz_version"]=> 
    string(5) "1.2.3" 
    ["protocols"]=> 
    array(9) { 
    [0]=> 
    string(4) "tftp" 
    [1]=> 
    string(3) "ftp" 
    [2]=> 
    string(6) "telnet" 
    [3]=> 
    string(4) "dict" 
    [4]=> 
    string(4) "ldap" 
    [5]=> 
    string(4) "http" 
    [6]=> 
    string(4) "file" 
    [7]=> 
    string(5) "https" 
    [8]=> 
    string(4) "ftps" 
    } 
} 
+0

est-ce que ssl dans 'curl_version()' est différent de 'curl -V'? –

+0

Ce message d'erreur semble plutôt provenir du serveur distant, ce qui signifie qu'il ne s'agit pas d'un problème de pare-feu. Pouvez-vous vérifier quelle est la valeur du paramètre PHP ini 'curl.cainfo' dans chaque cas? – CBroe

+0

@AlexBlex, j'ai peur, non. J'ai ajouté des versions à la question. –

Répondre

0

Merci à Alex Blex « s comment la sortie I a permis verbeux pour PHP cURL, et exécutez également la ligne de commande cURL avec l'option -vvv.

Cela m'a fait voir, que la requête de ligne de commande a été envoyée via le proxy, en fait, tandis que PHP cURL a essayé de faire un appel direct, qui a échoué.

Ensuite, j'ai utilisé l'option CURLOPT_PROXY pour ma demande PHP et il a également commencé à fonctionner.

0

Vous omis d'offrir le port ...

Vérifiez votre code corrigé ci-dessous:

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://<url_here>", 
    CURLOPT_PORT => "443", //MY CORRECTION TO YOUR CODE 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_SSL_VERIFYHOST => false, 
    CURLOPT_POST => 1, 
    CURLOPT_POSTFIELDS => "<body here>", 
    CURLOPT_HTTPHEADER => array(
     "content-type: application/xml" 
    ), 
)); 

(voir aussi this post ...)

+0

Lorsque le protocole est https, je pense que cURL est assez intelligent pour comprendre le port par défaut à lui seul. De plus, le message d'erreur indique que le port 443 a été utilisé, donc je doute que ce soit la solution. – CBroe

+0

Devinez vous avez raison ... Une autre chose est: votre serveur est-il en train de faire tourner SELinux? Si oui, désactivez-le et réessayez ... –

+0

Malheureusement, cela n'aide pas. C'est une image docker linux. –