Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-05-2010 18:30:55

gostbuster
Membre
Date d'inscription: 11-03-2009
Messages: 160

Wsdl, auto discover, phpDoc et types 'complexes'

Bonjour,

Après avoir un peu galéré a mettre en place mon server SOAP, et mon client SOAP (mais le forum m'a bien aidé, merci), je me pose une sérieuse question :

Mon objectif, c'est d'implémenter un service web qui fait l'intermédiaire entre un site et une base de données.

J'ai une classe qui gere toutes les connexion et les requetes au bases de données, dont voici une methode (celle qui me pose probleme) :

Code:

    /**
    * This function get results
    * @param string $sql
    * @return array
    */
    public function getResults($sql)
    { 
        
        if (func_num_args()>1)
        {
            $args = func_get_args();
            array_shift($args);
            $this->sql=vsprintf($sql,$args);
        }
        else
        {
            $this->sql=$sql;
        }
        $this->result = mysql_query($this->sql,$this->id);
        return $this->result;
        if (!$this->result) $this->warning();
    }

Il s'avère que cette fonction retourne un tableau (a la maniere d'un fetch all),

Un tableau est il considéré comme un type complexe ? Si oui, cela pose alors un problème vis à vis de l'autodiscover (qui genere le WSDL automatiquement?)

Avec cette phpDOC spécifiée, la méthode me renvoie NULL, voila pourquoi je me pose ces questions là.

Par avance merci pour votre aide.


Gostbuster - Développeur WEB

Hors ligne

 

#2 24-05-2010 10:37:14

armetiz
Membre
Lieu: Lyon
Date d'inscription: 26-02-2010
Messages: 53
Site web

Re: Wsdl, auto discover, phpDoc et types 'complexes'

D'après la documentation, il ne s'agit pas d'un type complexe : http://framework.zend.com/manual/fr/zend.soap.wsdl.html

Pense bien à faire des echo et à tester tes fonctions. Je travail beaucoup en ce moment avec les services AMF, et 80% des soucis provient de mes erreurs. Sur la fin du projet, les erreurs qui trainent sont les plus fourbent.

Pour vérifier mes fonctions, j'ai fais un Controller Zend qui me sert à appeler les fonctions de mes services. Cela me permet d'avoir les erreurs PHP et de voir tout les "echo".

Bonne chance.

Hors ligne

 

#3 25-05-2010 10:25:09

gostbuster
Membre
Date d'inscription: 11-03-2009
Messages: 160

Re: Wsdl, auto discover, phpDoc et types 'complexes'

Bonjour et merci pour cette réponse.

Ta réponse est complémentaire et m'est bien utile pour comprendre certaines choses, donc je te remercie Armetiz.
Cela dit, je pense savoir d'où vient le problème : La persistance de l'instance de la classe de mon webservice.

Concrètement voici ce qu'il se passe avec un exemple :

la classe de mon webservice:

Code:

class MonTest{

var $test='tata';

public function getTest()
{
return $this->test;
}

public function setTest()
{
$this->test='toto';
}
}

Quand j'appelle mon web service (dans un fichier php) je fais;

Code:

    $client = new Zend_Soap_Client("url de mon server.php?WSDL", $options); // Servers WSDL Location

    echo '<h2>affichage 1</h2>';
    $r=$client->getTest();
    echo $r;
        echo '<h2>modif 1</h2>';
        $client->setTest();
        
            echo '<h2>affichage 2</h2>';
    $r=$client->getTest();
    echo $r;

Au premier affichage on a tata (normal)

ensuite on fait la modif (pour que $test soit 'toto');

mais au deuxième affichage on a toujours tata.

Ce teste m'amène a la conclusion qu'il n'y a pas de persistance de la classe,
a chaque fois qu'on appelle une méthode de la classe du WS, on appelle en faite une nouvelle instance,

est-ce que mon raisonnement est juste ?

Si oui, peut on faire en sorte de rendre la classe persistante ?

Par avance merci pour ces renseignements


Gostbuster - Développeur WEB

Hors ligne

 

#4 25-05-2010 10:44:14

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: Wsdl, auto discover, phpDoc et types 'complexes'

il n'y a jamais de persistance des classes en php entre deux appel quelque soit la méthode d'appel

pour en avoir une il faut utiliser la session et la sérialisation
A+JYT

Hors ligne

 

#5 25-05-2010 11:02:15

gostbuster
Membre
Date d'inscription: 11-03-2009
Messages: 160

Re: Wsdl, auto discover, phpDoc et types 'complexes'

Merci pour ces informations, je vais faire quelques recherches à ce sujet, mais peut être que tu aurais des sources intéressantes à partager ?

Pour info, mon but est : sur un projet existant (qui fait une connexion classique a une base de données), de faire un adaptateur qui au lieu d'attaquer une base de données, consomme un webservice qui lui attaque la base de données.

Ce projet utilise une classe php qui gere tout ce qui est mysql (à l'aide de ses méthode),

Je ne peux que changer la classe, mais pas changer toutes les utilisations de cette classe partout dans le code.

Par avance merci pour tes sources de doc si tu en as.


Gostbuster - Développeur WEB

Hors ligne

 

#6 08-06-2010 11:24:30

thbenda
Membre
Date d'inscription: 07-06-2010
Messages: 12

Re: Wsdl, auto discover, phpDoc et types 'complexes'

Bonjour,

Et en désactivant le cache SOAP, ca devrait marcher mieux.

Code:

ini_set("soap.wsdl_cache_enabled", "0");

Cdlt.


Prendre le temps de faire les choses dans les temps. Sans doute pour avoir plus de temps pour faire d'autres choses dans les temps. Ne pas perdre de temps: facile à dire, facile à faire: de l'organisation et de la méthode!

Hors ligne

 

#7 10-08-2010 11:19:47

armetiz
Membre
Lieu: Lyon
Date d'inscription: 26-02-2010
Messages: 53
Site web

Re: Wsdl, auto discover, phpDoc et types 'complexes'

Comme la dit sekajin, il entre deux appels, il n'y a pas de persistance des données...

Quand tu appel la fonction
setTest (); tu fais une nouvelle connexion, qui initialise la class MonTest...
getTest (); tu fais une nouvelle connexion, qui initialise la class MonTest... Il est donc normal que cela retourne "tata"

Hors ligne

 

#8 10-08-2010 14:24:31

thbenda
Membre
Date d'inscription: 07-06-2010
Messages: 12

Re: Wsdl, auto discover, phpDoc et types 'complexes'

armetiz a écrit:

Comme la dit sekajin, il entre deux appels, il n'y a pas de persistance des données...

Quand tu appel la fonction
setTest (); tu fais une nouvelle connexion, qui initialise la class MonTest...
getTest (); tu fais une nouvelle connexion, qui initialise la class MonTest... Il est donc normal que cela retourne "tata"

Evidemment qu'il n'y a pas de persistance des données entre 2 appels d'une même classe, à moins de le prévoir soit via une couche ORM pour le SGBD utilisé, soit via les mécanismes de PHP: Sessions, Sérialisation, et Cache.

En fonction de la configuration de PHP, générique ou spécialisée pendant un runtime d'une application donnée, il est possible d'avoir l'illusion d'une persistance des données, alors qu'il n'en est rien dans la réalité des faits.

Le fait est que l'option dont je parle plus haut permet de conserver un certain temps ou non les résultats de requêtes SOAP précédentes pour éviter de saturer le réseau en direction d'un ou plusieurs serveurs, distants ou non.


Il faut bien comprendre que les flux SOAP sont en XML... Si c'est un format standard pour l'échange des données sur un réseau entre plusieurs applications, il compte parmi ses désavantages les plus gênants la verbosité du XML nécessaire aux échanges. Pour comparer, prendre en compte les formats JSON, JSONP, et autres formats classiques: TXT, CSV, TSV, etc.
D'où la mise en cache des données récupérées afin d'optimiser les temps d'exécution sans avoir un comportement agressif sur le réseau utilisé (monopolisation de la bande passante...).

Cordialement.


Prendre le temps de faire les choses dans les temps. Sans doute pour avoir plus de temps pour faire d'autres choses dans les temps. Ne pas perdre de temps: facile à dire, facile à faire: de l'organisation et de la méthode!

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages