为什么PHP SOAP会话不是持久的?
我用以下方式定义了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
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请求中的可序列化数据。还有$_会话中的一些内容。我有一个假名字。。。。