2013-09-27 2 views
3

Lorsqu'un utilisateur s'inscrit sur mon site Web, je dois envoyer une demande de savon dans une méthode qui ne bloque pas l'utilisateur. Si le serveur de savon fonctionne lentement, je ne veux pas que l'utilisateur final doive attendre. Y at-il un moyen que je puisse envoyer la demande et laisser mon application PHP principale continuer à fonctionner sans attendre une réponse du serveur de savon? Si ce n'est pas le cas, existe-t-il un moyen de définir un délai maximal sur la demande de savon et de gérer les fonctionnalités si la demande est supérieure à un délai d'expiration maximal?Demande de savon non bloquante PHP

Editer: Je voudrais idéalement gérer cela avec un délai d'expiration maximum pour la demande. Je donne les résultats suivants:

//ini_set('default_socket_timeout', 1); 
     $streamOptions = array(
       'http'=>array(
       'timeout'=>0.01 
      ) 
    ); 

     $streamContext = stream_context_create($streamOptions); 

     $wsdl = 'file://' . dirname(__FILE__) . '/Service.wsdl'; 

     try{ 
      if (file_get_contents($wsdl)) { 

       $this->_soapClient = new SoapClient($wsdl, 
        array(
         'soap_version' => SOAP_1_2, 
         'trace' => true, 
         'stream_context' => $streamContext 
       ) 
      ); 
       $auth = array('UserName' => $this->_username, 'Password' => $this->_password); 
       $header = new SoapHeader(self::WEB_SERVICE_URL, "WSUser", $auth); 
       $this->_soapClient->__setSoapHeaders(array($header)); 

      }//if 
     } 
     catch(Exception $e){ 
     echo "we couldnt connect". $e; 
     } 
$this->_soapClient->GetUser(); 

je définir le délai à 0,01 pour essayer de forcer la connexion à délai d'attente, mais la demande semble encore tirer au large. Qu'est-ce que je fais mal ici?

+0

php n'a pas été conçu pour cela. –

+1

PHP (en combinaison avec GTK, ou HTML (5)) est exactement conçu et prêt pour cela. – DanFromGermany

Répondre

1

Quatre solutions:

  1. Utilisez AJAX pour faire SOAP ->Simplest SOAP example

  2. Utilisez AJAX pour appeler un second fichier PHP sur votre serveur qui fait le SOAP (meilleure solution imo)

  3. Mettez la requête SOAP à la fin de votre fichier PHP (s) (et non le luxe solution)

  4. Utilisez pcntl_fork() et tout faire dans un deuxième processus (je désapprouve cela, il pourrait ne pas fonctionner avec toutes les configurations du serveur)

Selon la façon dont vous mettre en œuvre, PHP a beaucoup de configurations de délai d'attente, par exemple socket_set_timeout(), ou stream_set_timeout() (http://php.net/manual/en/function.stream-set-timeout.php)

2

J'ai eu les mêmes problèmes et j'ai implémenté la solution!

J'ai mis en

SoapClient::__doRequest(); 

Pour permettre à plusieurs appels de savon à l'aide

curl_multi_exec(); 

Jetez un oeil à ce asynchronous-soap