Bonjour,
Quelqu'un parmi vous aurais des connaissances et / ou des ressources sous php Curl ?

A part la documentation du site PHP, je ne trouve pas de tutoriel assez clairs .. Je n'y comprend pas grand chose.

Je souhaiterais avec php CUrl établir une connexion entre deux serveurs distant pour :

  • Récupérer les données du formulaire du premier serveur vers un autre serveur distant ( et les afficher ).
    J'ai trouvé un code d'exemple, mais je ne sais pas où le mettre ..
<?php 

$url = 'http://www.oseox.fr'; 
$timeout = 10; 

$ch = curl_init($url); 

curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

if (preg_match('`^https://`i', $url)) 
{ 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
} 

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

// Utilisation de la méthode POST 
curl_setopt($ch, CURLOPT_POST, true); 

// Définition des champs et valeurs à envoyer 
curl_setopt($ch, CURLOPT_POSTFIELDS, array( 
'email' => 'user@domain.tld' 
)); 

$page_content = curl_exec($ch); 

curl_close($ch); 

echo $page_content; 

?>

Merci

11 réponses


SimonDevelop
Réponse acceptée

Moi je vois plutôt ton traitement.php côté serveur 2 qui récupère les données en POST.
Après tu peux renvoyer un résultat en curl si tu le souhaite du serveur 2 vers serveur 1, mais c'est pas utile vu que ton serveur 1 attend une réponse de ton serveur 2 après l'envoie des données en curl.

Voici un exemple simple mais concret:
(Ton code coté serveur 1):

$ch = curl_init();
$url = "https://mon-serveur2.fr/traitement.php";

// Tes données à envoyer
$datas = array('email' => 'exemple@test.fr');

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $datas);

// Résultat retourné
$result = curl_exec($ch);

// En cas d'erreur
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}else{
  // Afficher le résultat du serveur 2, ici 'email bien reçu'
  echo $result;
}

// On ferme curl
curl_close ($ch);

(Ton code coté serveur 2):

if(!empty($_POST) && isset($_POST['email']){
    echo 'email bien reçu';
}

En faite si tu as bien compris le truc, php curl envoye des données en GET/POST sur une page php, dans ton cas sur une page php de ton second serveur qui vas les récupérer.

Donc c'est sur ton second serveur qu'il faut que tu traites la réception des données, faire les vérifications et retourner une erreur ou non en json par exemple.

Ta variable $page_content contient le contenu retourner de ta page du second serveur, donc si tu souhaites afficher les informations envoyées, vérifi que ton second serveur ne renvoi pas une erreur pour ensuite afficher simplement tes $_POST.

Par contre pour le https il n'est pas du tout recommander de faire ceci si tu transportes des données confidencielles (type password) :

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

Aide toi de ces liens :
http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/
https://stackoverflow.com/questions/521418/reading-ssl-page-with-curl-php

dev_8932
Auteur

Merci pour ta réponse !
Du coup mon traitement.php (celui que je met dans l'action du formulaire du serveur 1) se trouvera dans mon serveur 2 c'est bien ça ?
Et j'y rentrerais le code curl.

Le $url correspond à quoi exactement ? (La page où est mon formulaire je suppose ?)

Pour récupérer mes données de formulaire c'est bien ici :

curl_setopt($ch, CURLOPT_POSTFIELDS, array( 
'email' => 'user@domain.tld' 
)); 

Ici le 'email' correspond au 'name' et 'user@domain...' au 'value' de mon input c'est bien ça ?

Est ce que ce serais comme ça :

curl_setopt($ch, CURLOPT_POSTFIELDS, array( 
'nom' => $_POST['nom'],
'prenom' => $_POST['prenom'],
etc....

Sur ton serveur 2, tu récupères ton tableau array('email' => 'user@domain.tld') envoyé par curl comme ceci sur ton traitement.php

Le $url, c'est l'url absolut de ton fichier traitement.php sur ton serveur 2, exemple => http://www.oseox.fr/traitement.php.

Ta fonction curl vas juste lui transmettre en post les données dans ton tableau, ici c'est :
Côté serveur 1 (tu envoie les données au serveur 2)

curl_setopt($ch, CURLOPT_POSTFIELDS, array( 
'email' => 'user@domain.tld' 
)); 

côté serveur 2 (je reçois les données pour effectuer des actions)

$_POST['email'];
dev_8932
Auteur

Donc si j'ai bien compris :
Sur mon serveur 1 j'ai ma page traitement.php où je rajoute curl_setopt ?
sur mon serveur 2 : Je récupère les données avec du curl et les POST.

Ce n'est pas possible d'avoir la page traitement.php sur mon serveur 2 directement ?

dev_8932
Auteur

D'accord je pense avoir compris !!! Après je peux afficher ce que je veux dans ma page du serveur 2 j'imagine ça reste du php simple ..
Merci merci de ton énorme aide !
Du coup dans mon formulaire j'ai bien method=POST et action=(la page serveur1 avec le code curl) c'est ça ?

Oui car tu envoies les données via curl au serveur 2, ça reste du POST mais par curl car tu veux recevoir une réponse du serveur 2 :)
Oubli pas de mettre ce poste en résolu

dev_8932
Auteur

Bonjour,
Je me permet une dernière question . Tout a parfaitement fonctionné : l'envoie de mail, la récupération des données, un GRAND merci !
Par contre :
J'aimerais pouvoir sur une page totalement à part (sur le deuxième serveur ) afficher les données que j'ai récupérer du serveur 1 pour pouvoir les ajouter manuellement ou non dans une base de donnée etc .. Comment puis-je faire ça ?

Ton serveur 2 as déjà récupérer les données pour les enregistrer en base de données non ?
Tu les affiches tout simplement ta table en base ^^

dev_8932
Auteur

Pas bête .. Je ne réfléchis pas parfois !
Ca ne pose pas de problème si dans le fichier de traitement je fais l'envoie de mail ET l'envoie en base de donnée ? Les deux vont bien marcher ?

Biensur, tu as tes informations, tu peux faire autant de chose avec que tu veux