LockyFordが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サービスにアクセスすることに関して質問した場合も、安全なサービスにするつもりであると思われるため、安全なSOAPサービスの設定に関して別の質問をすることをお勧めします。 php。その質問であなたがやろうとしていることについてもっと説明すると、ベストプラクティスに関するさまざまな専門家からいくつかの良い情報を得ることができます:-)
)。
私はあなたがSOに不慣れであることを知っているので、あなたが答えに満足しているなら、あなたはそれを受け入れることができます。もちろん、あなたが方法を知っているときは簡単で、誰かがあなたに言うときはさらに簡単です;-)