IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

curl envoie 2 fois lorsqu'il y a un timeout


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut curl envoie 2 fois lorsqu'il y a un timeout
    Bonjour,
    J'envoie les informations au web service par cUrl et je reçois une réponse par la fonction curl_getinfo.
    Quand tout va bien, voici je que je vois dans la réponse par :
    "total_time";d:0.81099999999999994;
    En outre, je récupère aussi les informations suivantes par curl_exec
    :
    <?xml version="1.0" encoding="utf-8"?>
    <transaction success="true">
    <isSuccess>true</isSuccess>
    <transactionId>4567521</transactionId>
    <transactionDesc>Order</transactionDesc>
    <systemName>FIRSTNEW</systemName>
    <prodId>456988</prodId>
    <message/>
    <order>
    <!-- ici il y a tous les information etc etc..... -->
    </order>
    Donc, tout va bien et il n'y a pas d'autre envoie de la même information : jusqu’au là, tout va bien!

    Mais lorsqu'il y a un pépin au serveur distant, ce que j'obtiens :
    par curl_getinfo($curl) :

    "total_time";d:9.6400000000000006;
    et
    je reçois les informations suivantes par
    curl_exec($curl) :
    <?xml version="1.0" encoding="utf-8"?><transaction success="true">
    <isSuccess>true</isSuccess>
    <sentToOffline>true</sentToOffline>
    <transactionId>456752154</transactionId>
    <transactionDesc>Order</transactionDesc>
    <systemName>FIRSTNEW</systemName>
    <prodId>456988</prodId>
    <message>incapable connexion at FIRSTNEW (connection timed out).</message>
    </transaction>
    </transaction>
    Mais, ces informations en double donc il y a eu une tentative d'envoie des informations en 2 fois puisqu'il y a eu un timeout.
    Et l'on a vérifié, sur le serveur FIRSTNEW il y a deux envois.

    Comment puis-je empêcher du 2e envoi ? par quel parametre de Curl ?

    Est ce qu'il faut que je définisse le constant de crul (CURLOPT_TIMEOUT) ?

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut
    S'il n'y a pas de paramétrage dans la fonction de cUrl pour un seul envoi, il faut que je trouve une autre chose.

    Je me dis qu'il faut que je la fasse avec attribut <sentToOffline>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <sentToOffline>true</sentToOffline>
    Cet attribut ne se figure pas dans la réponse lorsqu'il y a un envoi réussi. Autrement dit, il y a cet attribut dans la réponse lorsqu'il y a un pépin avec FIRSTNEW

    Donc il faut que je cherche <sentToOffline>true</sentToOffline> dans curl_exec($curl) ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut
    Bonjour,
    Avec le code suivant je trouve si "sentToOffline" [false] ou *[true] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    libxml_use_internal_errors(true);
    $dom_OffLine = new DOMDocument;
     
     
    $dom_OffLine->loadHTML($responseOffLine);
    $nodeListToFind = $dom_OffLine->getElementsByTagName('senttooffline'); // <sentToOffline>false</sentToOffline>
     
    if ($nodeListToFind->length) 
    {
    	$responseOffLine_contains_false = $nodeListToFind->item(0)->nodeValue;
    	if ($responseOffLine_contains_false == 'true')
    		{
     
    			echo '<p> true on n\'arret pas le script</p>';
     
    			$nodeListMessage = $dom_OffLine->getElementsByTagName('message'); 
    			$raison_error = $nodeListMessage->item(0)->nodeValue;
    			echo '<p> pas de raison' . $raison_error . '</p>';
     
     
     
     
    		}
    	else
    		{
    			echo "<p>sent To Offline ::: F A L S E  </p>";
    			$nodeListMessage = $dom_OffLine->getElementsByTagName('message');
    			$raison_error = $nodeListMessage->item(0)->nodeValue;
    			echo '<p> il faut empêcher d\'envoyer une deuxième fois parce que  : '. $raison_error . '</p>';
    		}
    }
    par contre, je ne sais pas comment je peux intégrer dans mon code arreter le 2e envoi si c'est "false"

  4. #4
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut
    Voilà mon code Curl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    $info_json_decode = json_decode($recupere_json;
    $n_commande = $info_json_decode->n_commande;
     
    $price_usd = $info_json_decode->price_usd; 
     
    foreach ($info_json_decode->lignes_commande as $obj_montre)
    	{
    		switch($obj_montre->types_produit)
    			 {
    				 case 'montres' :
     
    					$email = $info_json_decode->email;
     
    					$last_name = $info_json_decode->address->last_name;
    					$phone = $info_json_decode->address->phone;
     
    					$chercheProduitId = cherche(array("-","--","---"),$obj_montres->id_numb);
    					$produitId = $chercheProduitId[0];
     
    					$commandeXml = '<?xml version="1.0" encoding="utf-8"?>
    								<order>
    									<transactionId>' . $n_commande . '</transactionId>';
     
     
    					$commandeXml  .= '</order>';
     
    					$lien_ws = $lien_ws .	$produitId. '?clntId=' . $clntId . '&keyN=' . $keyN ;
     
     
     
    					$curl = curl_init();
     
    					curl_setopt($curl, CURLOPT_URL, $lien_ws);
    					curl_setopt($curl, CURLOPT_POST, true);
     
    					curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    					curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
     
    					curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query(array('xml' => $commandeXml)));
    					curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // recevoir le résultat du transfert 
     
     
    					$responseRecu = curl_exec($curl);
     
    					if(curl_errno($curl))
    						{			
    							// erreur CURL c'est ici
    							$fichier_log = "\r\n" .'CURL\'S Error number: "' . curl_errno($curl) . '" and Error info: "'. curl_error($curl). '"'."\r\n";
    							file_put_contents($repertoire, $fichier_log, FILE_APPEND | LOCK_EX);
     
    						}
    					else
    						{
    						// pas d'erreur CURL c'est ici REUSSI
    						file_put_contents($repertoire, $data_for_log, FILE_APPEND | LOCK_EX);
    						 // ligne 56	 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!		
    						}
     
    					curl_close($curl);	
     
    					break;		// FIN TRAITEMENT SUR LES MONTRES */
     
    				default:
    				  // S'IL Y A D'AUTRES CHOSES QUE LE MONTRE, 
    				  //ON NE FAIT RIEN
    				break;
     
    			 }
    		// FIN PAS DE MONTRE DANS  types_produit */
    	 }		
    // FIN foreache  Construction les articles de  montres ------------------------------------------------------------------------------------- */
     
    exit();
    Je me demande si je dois mettre mon code qui commence par [libxml_use_internal_errors(true);] dans la ligne 56 ?


    Merci

  5. #5
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut
    Encore moi, bonjour

    Puisque je ne suis pas sûr je vous demande si je dois mettre un 'curl_close' à la ligne 75 pour que Curl n'envoie pas la deuxième fois les informations lorsqu'il y a timeout puisque sentToOffline est 'TRUE'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    <?php
    $info_json_decode = json_decode($recupere_json;
    $n_commande = $info_json_decode->n_commande;
     
    $price_usd = $info_json_decode->price_usd; 
     
    foreach ($info_json_decode->lignes_commande as $obj_montre)
    	{
    		switch($obj_montre->types_produit)
    			 {
    				 case 'montres' :
     
    					$email = $info_json_decode->email;
     
    					$last_name = $info_json_decode->address->last_name;
    					$phone = $info_json_decode->address->phone;
     
    					$chercheProduitId = cherche(array("-","--","---"),$obj_montres->id_numb);
    					$produitId = $chercheProduitId[0];
     
    					$commandeXml = '<?xml version="1.0" encoding="utf-8"?>';
    					$commandeXml  .= '<order><transactionId>' ;
    					$commandeXml  .= $n_commande;
    					$commandeXml  .= '</transactionId>';
     
     
    					$commandeXml  .= '</order>';
     
    					$lien_ws = $lien_ws .	$produitId. '?clntId=' . $clntId . '&keyN=' . $keyN ;
     
     
     
    					$curl = curl_init();
     
    					curl_setopt($curl, CURLOPT_URL, $lien_ws);
    					curl_setopt($curl, CURLOPT_POST, true);
     
    					curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    					curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
     
    					curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query(array('xml' => $commandeXml)));
    					curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // recevoir le résultat du transfert 
     
     
    					$responseRecu = curl_exec($curl);
     
    					if(curl_errno($curl))
    						{			
    							// erreur CURL c'est ici
    							$fichier_log = "\r\n" .'CURL\'S Error number: "' . curl_errno($curl) . '" and Error info: "'. curl_error($curl). '"'."\r\n";
    							file_put_contents($repertoire, $fichier_log, FILE_APPEND | LOCK_EX);
     
    						}
    					else
    						{
    							// pas d'erreur CURL c'est ici REUSSI
    							file_put_contents($repertoire, $data_for_log, FILE_APPEND | LOCK_EX);
    							 // ligne 56	 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	
    							libxml_use_internal_errors(true);
    							$dom_OffLine = new DOMDocument;
     
     
    							$dom_OffLine->loadHTML($responseOffLine);
    							$nodeListToFind = $dom_OffLine->getElementsByTagName('senttooffline'); // <sentToOffline>false</sentToOffline>
     
    							if ($nodeListToFind->length) 
    							{
    								$responseOffLine_contains_false = $nodeListToFind->item(0)->nodeValue;
    								if ($responseOffLine_contains_false == 'true')
    									{
     
    										echo '<p> true  donc les informations sont reçu même s\'il y a un timeOut alors il ne faut plus envoyer une autre fois</p>';
     
    										$nodeListMessage = $dom_OffLine->getElementsByTagName('message'); 
    										$raison_error = $nodeListMessage->item(0)->nodeValue;
    										echo '<p> pas de raison' . $raison_error . '</p>';
    										curl_close($curl); // ligne 77 !!!! ligne 77 !!!! ligne 77 !!!! ligne 77 !!!! 
     
     
     
     
    									}
    								else
    									{
    										echo "<p>sent To Offline ::: F A L S E  </p>";
    										$nodeListMessage = $dom_OffLine->getElementsByTagName('message');
    										$raison_error = $nodeListMessage->item(0)->nodeValue;
    										echo '<p> il faut empêcher d\'envoyer une deuxième fois parce que  : '. $raison_error . '</p>';
    									}
    							}
     
     
     
    						}
     
    					curl_close($curl);	
     
    				 break;		// FIN TRAITEMENT SUR LES MONTRES */
     
    				 default:
    				  // S'IL Y A D'AUTRES CHOSES QUE LE MONTRE, 
    				  //ON NE FAIT RIEN
    				 break;
     
    			 }
    		// FIN PAS DE MONTRE DANS  types_produit */
    	 }		
    // FIN foreache  Construction les articles de  montres ------------------------------------------------------------------------------------- */
     
    exit();
    Si non, que je dois mettre dans la ligne 77 ?

    Merci

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    salut,

    j'ai regardé de mon côté et effectivement, je n'ai pas trouvé le moyen d'éviter une seconde tentative, le mieux c'est bien sûr de poser un curl_close() à chaque embranchement dans ton traitement

Discussions similaires

  1. [PHP 5.5] Comment puis-je voir ce que mon curl envoie
    Par tonton.odilon dans le forum Langage
    Réponses: 7
    Dernier message: 13/10/2015, 16h57
  2. Envoi plusieurs fois les requetes, httpPost
    Par mailoy dans le forum Android
    Réponses: 6
    Dernier message: 13/06/2015, 16h48
  3. [cURL] Envoi POST sur page aspx
    Par bourvil dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 27/04/2011, 13h58
  4. cURL -- envoi d'un fichier en HTTP
    Par Arnard dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 06/07/2008, 14h49
  5. [cURL] envoi de variables POST
    Par billoum dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 14/09/2006, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo