我通过以下方式定义了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");
有什么想法?谢谢!
答案 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.';
}
?>