我同意 RockyFord 关于这是一个 SSL 问题的观点(我很确定您将拥有一个自签名证书,并且由于使用 SSL,您需要采取一些步骤来最大程度地减少安全问题)。关于眼前的问题,您可以尝试使用类似以下的代码来修复它:
$url = 'https://zendsoap.lan/Zend_Soap_Server.php?wsdl';
$contextOptions = array(
'ssl' => array(
'verify_peer' => true,
'CN_match' => 'zendsoap.lan' // assuming zendsoap.lan is the CN used in the certificate
)
);
$sslContext = stream_context_create($contextOptions);
$wsdlContent = file_get_contents($url, NULL, $sslContext);
(更新: 将上面的代码更改为
'verify_peer' => false
虽然它对于基本开发来说可能没问题,但这并不是一个好主意,绝对不应该在生产环境中使用,因为它会引入严重的安全问题 - 请参阅这篇关于如何从 PHP 代码中通过 SSL 正确保护远程 API 调用的优秀文章Artur Ejsmont了解有关此主题的更多信息以及OWASP的传输层安全备忘单和保护 Web 服务)
要了解关于在 Zend Framework 应用程序中共享 WSDL 的观点,您可以执行以下操作来开始:
// go to application/configs/application.ini
// if your APPLICATION_ENV is development then add the following line in the development section:
phpSettings.soap.wsdl_cache_enabled = 0
上面的行将防止您的 wsdl 在开发过程中被缓存。接下来,您可能想要创建一个 SoapController 并添加此操作,如下所示:
public function serverAction()
{
$baseUrl = 'http://zendsoap.lan/soap/server';
if( isset( $_GET['wdsl'] ) ) {
$strategy = new Zend_Soap_Wsdl_Strategy_AnyType();
$server = new Zend_Soap_AutoDiscover($strategy);
$server->setUri($baseUrl);
$server->setClass('Application_Model_Web_Service');
$server->handle();
} else {
$server = new Zend_Soap_Server($baseUrl . '?wsdl');
$server->setClass('Application_Model_Web_Service');
$server->handle();
}
}
上述方法的好处是 WSDL 将为您即时生成。您会注意到 setClass() 方法将被调用,并且将“Application_Model_Web_Service”作为唯一参数传递。要测试您的配置,我建议您创建该类并插入下面的方法。使用包含单一方法的简单服务测试您的配置将帮助您在使服务变得更复杂之前进行故障排除。这是示例方法:
// Note: you should definitely comment your methods correctly in the class so
// the WSDL will be generated correctly - by that I mean use @param and @return
// so the correct input and output types can be determined and added to the WSDL
// when the the ZF component generates it for you
/**
* @return string
*/
public function getMessage()
{
return 'ok';
}
(更新: 同样针对您提出的关于使用Zend_Soap_Client访问 Web 服务的问题,因为看起来您打算使其成为安全服务,我建议您提出一个关于设置安全肥皂服务的单独问题php. 如果您在该问题中解释更多有关您尝试做什么的信息,您可能会从一系列专家那里获得有关最佳实践的一些很好的意见:-)
)
我知道您是 SO 的新手,所以如果您对答案感到满意,您可以接受它,通常最好只回复一个答案,而不是添加另一个答案来回复。当你知道当然很容易,当有人告诉你时更容易;-)