Manejo de sesiones de un webservice

Hola Buen día

Estoy trabajando en una aplicación que la mayor parte de los datos los obtiene de webservice, pero tengo dudas en como manejar la sesiones de este, les doy un ejemplo de como funciona:

Inicio Sesión

->Consulta Servicio1

->Consulta Servicio2

->Consulta Servicio3

Cerrar Sesión

Cada uno de los servicios los tengo en vistas separadas, el inicio y cierre de sesión en un modelo, lo que quiero es pasar $client entre vistas y consumir el servicio determinado sin tener que iniciar sesión en cada uno de estos, ya que en el modelo realizo el proceso de inicializar la conexión y setear el Soapheader con las variables de autenticación, por lo cual no quiero que en cada vista(consumo de servicio) deba iniciar sesión (lo cual no es lógico) y también definir un tiempo para cerrar la sesión si el cliente cerro la aplicación sin completar todos los pasos.

Pensé en hacer un caching de la variable pero no me funciona





public static function serviceConnection() {

           

            $value = Yii::app()->cache->get('sesionServicio');

        

        if ($value === false) {

            try {

                $url = "url.wsdl";

                $param = array(

                    'param1' => 'param2'

                );


                $client = new SoapClient($url, array('trace' => true));

                $client->ServicioaConsumir($param);

                Yii::app()->cache->set('sesionServicio', $client, 120);

                $value = Yii::app()->cache->get('sesionServicio');

            } catch (Exception $e) {

                echo 'Caught exception: ', $e->getMessage(), "\n";

            }

        }

        return $value;

    }



Los anterior me genera SoapClient::__call(): supplied argument is not a valid sdl resource

pero si le retorno $client si funciona.

Aclaro dos cosas estoy empezando con yii, y estoy mirando como hacer que el webservice funcione adecuadamente según lo comentan en CWebService, pero para este segundo no e encontrado mucha información, si de pronto alguien tiene información o ejemplo de como se debe consumir adecuadamente servicios con esta clase les agradezco también.

Les agradezco por su ayuda o sugerencia

Bueno les cuento como solucione el inconveniente que tenia, me base en el ejemplo que tienen en yiiframeworkenespanol.org/foro/showthread.php?tid=38, termine almacenando las variables de authenticacion en el servidor por determinado tiempo, y si existe una session activa toma los datos y la ejecuta, si no la tiene genera una nueva. Tal vez no se la solución mas cristiana pero por ahora me funciona mientras me siento a pulir el código.




private function getClienteInt() {

        $url = "urlwsdl";

        $value = Yii::app()->cache->get('header');

        if(value == null)

        {

            ini_set (  'soap.wsdl_cache_enable'  ,  0  ); 

            ini_set (  'soap.wsdl_cache_ttl'  ,  0  );

            $param = array(

                'parametro' => 'parametro');

            

            $this->cliente = new SoapClient($url, array('trace' => true));

            $this->cliente->servicioAutenticar($param);

            $this->cliente = $this->setsoapHeader($this->cliente, true);

            

        }

        else {

			$this->cliente = new SoapClient($url, array('trace' => true));

            $this->cliente = $this->setsoapHeader($this->cliente, false);

			}

        return $this->cliente;

    }

    

    public function setsoapHeader($parametros, $var) {

        

        $this->cliente = $parametros;

        $namespace = 'namespace';

        if($var)

        {

            $last2 = $this->cliente->__getLastResponse();

            //Get soap Header

            $xmlString = preg_replace("/(<\/?)(\w+)<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/sad.gif' class='bbc_emoticon' alt=':(' />[^>]*>)/", "$1$2$3", $last2);

            $xml = simplexml_load_string($xmlString);

            $Id = $xml->soapHeader[0]->Session[0]->Id;

            $SNumber = $xml->soapHeader[0]->Session[0]->SNumber;

            $SToken = $xml->soapHeader[0]->Session[0]->SToken;

            Yii::app()->cache->set('header', $strHeaderComponent_Session, 30);

            //Body of the Soap Header.

            $strHeaderComponent_Session = "<Session><Id>$Id</Id><SNumber>$SNumber</SNumber><SToken>$SNumber</SToken></Session>";

            $objVar_Session_Inside = new SoapVar($strHeaderComponent_Session, XSD_ANYXML, null, null, null);

            //Create Soap Header. 

            $objHeader_Session_Outside = new SoapHeader($namespace, 'Session', $objVar_Session_Inside);

            //set the Headers of Soap Client.

            $this->cliente->__setSoapHeaders(array($objHeader_Session_Outside));

            

        }

        

        //Body of the Soap Header.

        $value = Yii::app()->cache->get('header');

        

        $objVar_Session_Inside = new SoapVar($value, XSD_ANYXML, null, null, null);

        //Create Soap Header. 

        

        $objHeader_Session_Outside = new SoapHeader($namespace,'Session', $objVar_Session_Inside);


        //set the Headers info in a cache

        //Yii::app()->cache->set('variable', $objHeader_Session_Outside, 120);

        

        $this->cliente->__setSoapHeaders(array($objHeader_Session_Outside));

            

        return $this->cliente;

    }

    

public function obtenerServicio($parametros) {

	    return $this->getClienteInt()->Servicio($parametros);

    }

public function obtenerServicio2($parametros) {

        return $this->getClienteInt()->Servicio2($parametros);

    }

public function obtenerServicio3($parametros) {

        return $this->getClienteInt()->Servicio3($parametros);

    }