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

为什么PHP SOAP会话不是持久的?,php,soap,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_PERSIST

我用以下方式定义了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");

有什么想法吗?谢谢大家!

\u-bogus\u-session\u-name
似乎是soap扩展使用的会话数组中的键(请参阅)


对于存储在会话中的对象,通常的建议是:在调用session\u start之前,确保类定义可用,或者在调用
handle

之前设置了自动加载处理程序。PHP中的SOAP库不会在每个默认请求之间保留cookie。您需要使用getLastResponseHeaders()手动获取它们,并使用u setCookie()对它们进行设置。

首先您可以尝试始终这样设置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第二个参数是自由选择的,第三个参数是可选的,可以为空以解决此问题。只需添加一个空标题

…然后,第二步您不应该在初始化服务器之前进行
会话\u start()

…和third尝试不在运行时设置php.ini设置,而是在php.ini中设置

提示:当您从Zend Framework 2使用Zend/Soap/Client.php时,SoapHeader将始终被设置。这对我来说就解决了

测试:在
SOAP\u PERSISTENCE\u SESSIONs
上测试SoapServer的最佳方法是为它添加一个类变量、一个setter和一个getter

下面是示例类:

<?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.';
    }
?>


检查在第二次调用时会话中是否确实有数据。@Artefactor:没有,没有。我有四个电话。前两个在$\u会话中没有任何内容,在$\u请求中也没有。但是在第三节。四,。调用$u请求中的可序列化数据。还有$_会话中的一些内容。我有一个假名字。。。。