为什么PHP SOAP会话不是持久的?

时间:2010-06-13 13:51:32

标签: php soap

我通过以下方式定义了SOAP服务器。

ini_set('soap.wsdl_cache_enabled', 0);
ini_set('session.auto_start', 0); 
global $config_dir;     
session_start();

$server = new SoapServer("xxxx.wsdl");      
$server->setClass('import');
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();

当我将它与SoapClient连接并调用公共函数时,会话似乎不是持久的。我在第一次调用时设置了一个私有变量,但是这个变量在第二次调用时失去了它的值....

$client = new SoapClient('xxxx.wsdl', array('trace' => 1, 'exceptions' => 1));

//The First call. I set the fromdb private variable to "nostran"
$client->setFromdb("nostran");  

//The second call. Here I need the fromdb but it has not any value....
$b = $client->setIrodak_id("1234");

有什么想法?谢谢!

3 个答案:

答案 0 :(得分:2)

_bogus_session_name似乎是soap扩展使用的会话数组中的键(请参阅source)。

对会话中存储的对象的通常建议适用:确保在调用session_start之前类定义可用,或者在调用handle之前设置了自动加载处理程序。

答案 1 :(得分:0)

PHP中的SOAP库默认情况下不会在请求之间保留cookie。您需要使用getLastResponseHeaders()手动获取它们并使用__setCookie()设置它们。

答案 2 :(得分:0)

首先您可以尝试始终像这样设置SoapHeader:

$header = new SoapHeader('{NAMESPACE__YOU_CAN_FIND_IT_IN_YOUR_WSDL__TARGETNAMESPACE}', 'SessionPersistenceHeader');

$client = new SoapClient('xxxx.wsdl', array('trace' => 1, 'exceptions' => 1));

$client->__setSoapHeaders($header);

SoapHeader第二个参数是自由选择的,第三个参数是可选的,可以为空以解决此问题。只需添加一个空标题。

...以及第二:在初始化服务器之前,您不应该session_start()

...和第三尝试不在运行时设置php.ini设置,而是在php.ini中设置。

提示:当您使用Zend Framework 2中的Zend / Soap / Client.php时,将始终设置SoapHeader。这解决了我。

测试:在SOAP_PERSISTENCE_SESSIONs上测试SoapServer的最佳方法是使用类变量,一个setter和一个getter。

这里是example-class:

<?php

class soaptest {

    /**
     * var
     *
     * @var int
     * @access private
     */
    private $_var = 0;

    /**
     * setVar
     *
     * @param int $value
     * @access public
     * @return void
     */
    public function setVar($value) {
        $this->_var = $value;
    }

    /**
     * getVar
     *
     * @access public
     * @return int
     */
    public function getVar() {
        return $this->_var;
    }

}

?>

而不是在TestClient中:

<?php

    // [...]

    $value = 123;
    $client->setVar($value);
    $result = $client->getVar();

    if ($value == $result) {
        echo 'SoapAPI is session persistent.';
    } else {
        echo 'SoapAPI is NOT session persistent.';
    }
?>