我正在尝试使用wsdl自动发现模式中的Zend_Soap_Server创建一个Web服务,但是我获得了非常奇怪的效果......这里的代码: 服务器:
<?php
require_once('Zend/Soap/AutoDiscover.php');
require_once('Zend/Soap/Server.php');
require_once('Zend/Soap/Wsdl.php');
require_once('library/SoapActions.php');
$wsdl = new Zend_Soap_Autodiscover();
$wsdl->setClass('SoapActions');
if (isset($_GET['wsdl'])) {
$wsdl->handle();
} else {
$server = new Zend_Soap_Server('http://localhost:8083/server.php?wsdl');
$server->setClass('SoapActions');
$server->setEncoding('ISO-8859-1');
$server->handle();
}
SoapActions类:
class SoapActions {
/**
* Test function
*
* @param String $a
* @param String $b
* @return String
*/
public function test1($a, $b) {
return "you passed me ".$a." ".$b;
}
/**
* Test function 2
*
* @param String $a
* @param String $b
* @return String
*/
public function test2($a, $b) {
return "you passed me ".$a." ".$b;
}
}
我尝试使用Zend_Soap_Client类使用函数test1和test2,这里是代码:
require_once('Zend/Soap/Client.php');
$client = new Zend_Soap_Client("http://localhost:8083/server.php?wsdl");
try {
echo $client->test2("foo","bar"); //this works!
} catch (Exception $e) {
echo $e;
}
try {
echo $client->test1("foo","bar"); //this doesn't work!
} catch (Exception $e) {
echo $e;
}
我无法理解因为test2函数按预期工作,test1函数返回以下异常:
SoapFault异常:[发件人]功能 (“test1”)不是有效的方法 这项服务 /usr/local/zend/share/ZendFramework/library/Zend/Soap/Client.php:1121 堆栈跟踪: 0 /usr/local/zend/share/ZendFramework/library/Zend/Soap/Client.php(1121): SoapClient-&gt; __ soapCall('test1',Array, NULL,NULL,Array) 1 /usr/local/zend/apache2/htdocs/webservice/client.php(6): Zend_Soap_Client-&GT; __呼叫( 'TEST1', 阵列) 2 /usr/local/zend/apache2/htdocs/webservice/client.php(6): Zend_Soap_Client-&gt; test1('foo','bar') 3 {main}
我试图反转函数名称......结果令人难以置信,仅适用于test2!我疯了,似乎在服务器端的某个地方保存了功能名称......
有人可以帮助我吗?
答案 0 :(得分:7)
解决了!问题是php.ini文件中的这个设置:
soap.wsdl_cache_enabled=1
我将其设置为0
,现在效果正常!
答案 1 :(得分:1)
如果你不想改变你的php.ini:
// WSDL_CACHE_NONE; /* 0 Pas de cache */
// WSDL_CACHE_DISK; /* 1 Sur le disque supprimer le fichier pour le réinitialiser */
// WSDL_CACHE_MEMORY; /* 2 En mémoire => redémarrer Apache pour le réinitialiser */
// WSDL_CACHE_BOTH; /* 3 En mémoire et sur le disque */
$options = array();
$options['cache_wsdl'] = WSDL_CACHE_NONE;
$client = new Zend_Soap_Client("http://localhost:8083/server.php?wsdl", $options);