元のアドレス: PHP SOAP 拡張子。この記事は、元のテキストに基づいていくつかの内容と章を追加し、いくつかのコメントも追加しています。
PHP の SOAP 拡張機能は、Web サービスの提供と利用に使用できます。つまり、PHP 開発者は、この PHP 拡張機能を使用して独自の Web サービスを作成したり、特定の Web サービスを使用するクライアントを作成したりできます。
PHP5 のこの SOAP 拡張機能の目的は、Web サービスに対する PHP のサポートを実装することです。 Web サービスの PHP サポートを実装する他の方法とは異なり、SOAP 拡張機能は C で記述されているため、他の方法よりも速度が向上します。注: SOAP 拡張機能は PHP5 でのみ提供されていたため、それ以前は、SOAP を使用して Web サービスを呼び出す場合は、通常、NuSOAP などのサードパーティが提供する SOAP パッケージ化ライブラリを使用していました。
SOAP 拡張機能は次の仕様をサポートしています:
SOAP 1.1
SOAP 1.2
WSDL 1.1
SOAP 拡張機能は、主に Web サービスを RPC 形式で処理するために使用されます。ただし、WSDL スキーマ サーバーおよびクライアントでテキストの WSDL ファイルを使用することもできます。
この拡張機能は、GNOME XML ライブラリを使用して XML を処理します。
この拡張機能は 6 つのクラスを実装します。 SoapClient、SoapServer、SoapFault という便利なメソッドを備えた 3 つの高レベル クラスがあります。他の 3 つのクラスには、コンストラクター以外のメソッドはありません。これら 3 つは、SoapHeader、SoapParam、および SoapVar です。
SOAP 拡張図:
SoapServer も応答として SoapHeader を送信できるため、上の図はあまり正確ではありません。すべては、次のより正確な関係図を持ちます。
このクラスは、Web サービスを使用するために使用されます。 SoapClient クラスは、特定の Web サービスのクライアントとして機能できます。
2 つの操作形式があります:
WSDL モード
非 WSDL モード
WSDL モードでは、コンストラクターは WSDL ファイル名をパラメーターとして使用し、サービスを使用するために必要な情報を WSDL から自動的に抽出できます。
非WSDLモードでは、サービス利用時に必要な情報をパラメータを使用して設定します。このクラスには、サービスを使用するために使用できる便利なメソッドが多数あります。その中で、SoapClient::__soapCall() が最も重要です。このメソッドを使用して、サービス内の操作を呼び出すことができます。
このクラスは、Web サービスを提供するために使用できます。 SoapClient と同様に、SoapServer にも WSDL モードと非 WSDL モードという 2 つの動作モードがあります。これら 2 つのモードの意味は、SoapClient の 2 つのモードと同じです。 WSDL モードでは、サービスは WSDL によって提供されるインターフェイスを実装します。非 WSDL モードでは、サービスの動作を管理するためにパラメータが使用されます。
SoapServer クラスの多くのメソッドの中で、より重要なメソッドが 3 つあります。それらは、SoapServer::setClass()、SoapServer::addFunction()、および SoapServer::handle() です。
SoapServer::setClass() メソッドは、Web サービスの実装に使用されるクラスを設定します。 SoapServer::setClass によって設定されたクラス内のすべてのパブリック メソッドは、Web サービスのオペレーションになります。
SoapServer::addFunction() メソッドは、1 つ以上の関数を Web サービス操作として追加するために使用されます。
SoapServer::handle() メソッドは、Web サービス スクリプトに受信リクエストの処理を開始するように指示します。 Web サービス スクリプトは、PHP スクリプトで記述された 1 つ以上の SoapServer オブジェクトのインスタンスです。複数の SoapServer オブジェクトを持つことができますが、一般的な規則では、スクリプトごとに SoapServer インスタンスを 1 つだけ持つことになります。 SoapServer::handle() メソッドを呼び出す前に、Web サービス スクリプトは SoapServer オブジェクト インスタンスに設定されている情報を使用して受信リクエストを処理し、適切なコンテンツを出力します。
このクラスは Exception クラスを継承しており、エラーの処理に使用できます。 SoapFault インスタンスは、Soap エラーに関する情報をスローまたは取得し、プログラマの要求に応じて処理できます。
このクラスは、SOAP ヘッダーを記述するために使用できます。これは、コンストラクター メソッドのみを含む単なるデータ コンテナーです。
SoapParam も、コンストラクター メソッドのみを含むデータ コンテナーです。このメソッドは、Web サービス操作に渡されるパラメータを記述するために使用できます。これは、非 WSDL モードでパラメーター情報を目的の形式で渡す場合に便利なクラスです。
SoapVar も、SoapHeader クラスや SoapParam クラスと同様、コンストラクターのみを含む低レベルのクラスです。このクラスを使用して、エンコードされたパラメータを Web サービス操作に渡すことができます。このクラスは、非 WSDL で型情報を伝達するのに役立ちます。
注: SoapParam と SoapVar は主に、SOAP リクエストに入れるためのデータをカプセル化するために使用されます。これらは主に非 WSDL モードで使用されます。実際、WSDL モードでは、SOAP リクエストのパラメータを配列にパッケージ化でき、SOAP 拡張機能がこの配列を WSDL ファイルに基づいて SOAP リクエストのデータ部分に変換するため、これら 2 つのクラスは必要ありません。非 WSDL モードでは、WSDL ファイルが提供されないため、これら 2 つのクラスを通じてパッケージ化する必要があります。
SoapHeader クラスは、SOAP ヘッダーの構築に使用され、SOAP 機能に必要な拡張を行うことができます。 SOAP ヘッダーの主な用途の 1 つは、単純な認証です。
Web サービスには、Contract First モードと Code First モードの 2 つの実装モードがあります。
コントラクトファースト モードでは、サービス インターフェイスを XML で定義する WSDL ファイルを使用します。 WSDL ファイルは、サービスが実装する必要があるインターフェイス、またはクライアントが使用できるインターフェイスを定義します。 SoapServer および SoapClient の WSDL スキーマは、この概念に基づいています。
コードファースト モードでは、まずサービスを実装するコードを記述する必要があります。ほとんどの場合、コードはコントラクト (いくつかのツールを使用して生成できます)、つまり WSDL ファイルを生成します。その後、クライアントは、サービスの使用時にその WSDL を使用して、サービスのインターフェイスやその他の情報を取得できます。ただし、PHP5 拡張機能はコードから WSDL 実装をエクスポートしません。これを考慮すると、非 WSDL モードで SoapServer と SoapClient を使用することができます。
このセクションでは、WSDL モードと非 WSDL モードを使用してサービスとクライアントを実装する方法について説明します。比較的に、インターフェイスを定義する WSDL ファイルがすでに存在すると仮定すると、WSDL パターンを使用してサービスとクライアントを実装する方が簡単です。したがって、このセクションではまず、WSDL パターンを使用して Web サービスを実装する方法を紹介します。
Windows プラットフォームの場合、次のコードを php.ini に追加する必要があります:
extension = php_soap.dll
上記の作業が完了したら、次のコードも追加します。 SOAP に注意する必要があります。拡張機能には構成ファイル内に独立したコード スニペットがあります:
[soap]; Enables or disables WSDL caching feature.; http://php.net/soap.wsdl-cache-enabledsoap.wsdl_cache_enabled=1; Sets the directory name where SOAP extension will put cache files.; http://php.net/soap.wsdl-cache-dirsoap.wsdl_cache_dir="D:/wamp/tmp"; (time to live) Sets the number of second while cached file will be used; instead of original one.; http://php.net/soap.wsdl-cache-ttlsoap.wsdl_cache_ttl=86400; Sets the size of the cache limit. (Max. number of WSDL files to cache)soap.wsdl_cache_limit = 5
これらの構成項目は主に、WSDL ファイルを処理する際の PHP のキャッシュ動作を指定するために使用されます。これらの設定項目はそれぞれ、WSDL ファイル キャッシュを有効にするかどうか、ファイル キャッシュの場所、キャッシュ時間、およびキャッシュされるファイルの最大数を説明します。キャッシュを有効にすると、PHP による WSDL ファイルの処理が高速化されますが、コードのデバッグ時はキャッシュ動作に関する問題を回避するためにキャッシュをオフにすることをお勧めします。
この Hello World サンプルのサービスには、greet という名前の操作があります。この操作は、名前パラメータを文字列として受け取り、Hello + 名前を文字列として返します。使用される WSDL は次のとおりです:
<wsdl:definitions xmlns:impl='http://localhost/php-soap/wsdl/helloService' xmlns:intf='http://localhost/php-soap/wsdl/helloService' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns:wsdlsoap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:xsd='http://www.w3.org/2001/XMLSchema' targetNamespace='http://localhost/php-soap/wsdl/helloService'> <wsdl:types> <schema elementFormDefault='qualified' xmlns:impl='http://localhost/php-soap/wsdl/helloService' xmlns:intf='http://localhost/php-soap/wsdl/helloService' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace='http://localhost/php-soap/wsdl/helloService' > <element name='greet'> <complexType> <sequence> <element name='name' type='xsd:string' /> </sequence> </complexType> </element> <element name='greetResponse'> <complexType> <sequence> <element name='greetReturn' type='xsd:string' /> </sequence> </complexType> </element> </schema> </wsdl:types> <wsdl:message name='greetRequest'> <wsdl:part name='parameters' element='impl:greet' /> </wsdl:message> <wsdl:message name='greetResponse'> <wsdl:part name='parameters' element='impl:greetResponse' /> </wsdl:message> <wsdl:portType name='helloService'> <wsdl:operation name='greet'> <wsdl:input name='greetRequest' message='impl:greetRequest' /> <wsdl:output name='greetResponse' message='impl:greetResponse' /> </wsdl:operation> </wsdl:portType> <wsdl:binding name='helloServiceSoapBinding' type='impl:helloService'> <wsdlsoap:binding transport='http://schemas.xmlsoap.org/soap/http' style='document' /> <wsdl:operation name='greet'> <wsdlsoap:operation soapAction='helloService#greet' /> <wsdl:input name='greetRequest'> <wsdlsoap:body use='literal' /> </wsdl:input> <wsdl:output name='greetResponse'> <wsdlsoap:body use='literal' /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name='helloService'> <wsdl:port binding='impl:helloServiceSoapBinding' name='helloService'> <wsdlsoap:address location='http://localhost/php-soap/wsdl/hello_service_wsdl.php' /> </wsdl:port> </wsdl:service></wsdl:definitions>
以下は、SOAP 拡張機能を使用してサービス プロビジョニングを実装するための WSDL モード サービスのコードです:
<?phpfunction greet($param){ $value = 'Hello ' . $param->name; $result = [ 'greetReturn' => $value ]; return $result;}$server = new SoapServer('hello.wsdl');$server->addFunction('greet');$server->handle();
このサービスの実装中に、この関数は WSDL で定義されたサービス操作の挨拶を実装します。挨拶操作のセマンティクスによれば、このパラメータはユーザーの名前です。最後に、ハンドルは、処理リクエストをトリガーするサービス オブジェクトを呼び出します。
クライアント コードは次のとおりです。
try { $client = new SoapClient('hello.wsdl'); $result = $client->__soapCall('greet', [ ['name' => 'Suhua'] ]); printf("Result = %s", $result->greetReturn);} catch (Exception $e) { printf("Message = %s",$e->__toString());}
クライアント コードでは、まず WSDL ファイルをパラメータとして使用する SoapClient インスタンスを作成します。次に、__soapCall() を使用して、greet メソッドを呼び出し、パラメータを渡します。
以下はクライアントによって送信される SOAP リクエストです:
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/php-soap/wsdl/helloService"> <SOAP-ENV:Body> <ns1:greet> <ns1:name>Suhua</ns1:name> </ns1:greet> </SOAP-ENV:Body></SOAP-ENV:Envelope>
以下はアピールリクエストに応じてサーバーによって送信される SOAP レスポンスです:
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/php-soap/wsdl/helloService"> <SOAP-ENV:Body> <ns1:greetResponse> <ns1:greetReturn>Hello Suhua</ns1:greetReturn> </ns1:greetResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>
上記の SOAP メッセージは、WSDL モードでサーバーとクライアントを使用して取得されます (クライアントの初期化時にトレース パラメーターが true に設定されていれば、__getLastResponse と __getLastRequest の 2 つのメソッドを使用して取得できます)。非 WSDL モードのサーバーおよびクライアントを使用して、上記と同じ SOAP メッセージを生成することもできます。ただし、PHP コードを少し変更する必要があります。次のセクションでは、非 WSDL モードの使用方法について説明します。
function greet($param){ $value = 'Hello '.$param; return new SoapParam($value, 'greetReturn');}$server = new SoapServer(null, [ 'uri' => 'http://localhost/php-soap/non-wsdl/helloService']);$server->addFunction('greet');$server->handle();
非WSDLモードでも、WSDLモードと同様にまずgreet関数の機能が実装されますが、関数の実装方法がWSDLとは若干異なります。モードが違います。非 WSDL モードでは、応答として配列ではなく SoapParam オブジェクトを返す必要があります。サービスを作成するとき、最初のパラメータは null に設定され、WSDL が提供されないことを示します。その後、オプションがパラメータとして渡されます。このオプション パラメータはサービスの URI です。最後に、WSDL パターンと同様に残りのメソッドを呼び出します。
try { $client = new SoapClient(null, [ 'location' => 'http://localhost/php-soap/non-wsdl/hello_service_non_wsdl.php', 'uri' => 'http://localhost/php-soap/non-wsdl/helloService' ]); $result = $client->__soapCall('greet', [ new SoapParam('Suhua', 'name') ]); printf("Result = %s", $result);} catch (Exception $e) { printf("Message = %s",$e->__toString());}
非 WSDL モードでは、WSDL が使用されないため、サービスの場所とサービス URI を含むパラメータ配列がパラメータとして渡されます。次に __soapCall() メソッドが WSDL スキーマと同様に呼び出されますが、SoapParam クラスを使用してパラメーターを指定された形式にパックします。返された結果は、greet メソッドの応答を取得します。
注: クライアントがインスタンス化されるときに渡されるサービス URI は、実際には、サービスの名前空間と考えることができます。クライアントによって渡される URI は、サーバーによって指定された URI と同じである必要があります。
この記事では、PHP で Web サービスを提供および利用するために使用できる SOAP 拡張機能を紹介します。 PHP SOAP 拡張機能の強みは、そのシンプルさと速度です。 C で書かれた SOAP 拡張機能を使用してサーバーとクライアントを実行するのは非常に簡単です。 SOAP 拡張機能は、いくつかの単純な Web サービスを処理する場合には便利ですが、すべての Web サービスを処理するために使用すると制限が生じます。 WSO WSF/PHP は、PHP 拡張機能の欠点を補うために開発されました。オープン ソースであり、SOAP のような機能を実装でき、MTOM、WS-Addressing、WS-Security、および WS-RelaiableMessaging をサポートします。 WSO2 WSF/PHP は、SOAP 拡張機能と同様の API をサポートします。 C で記述される SOAP 拡張機能と同じ API を提供するために API をパッケージ化する予定です。
この記事の原文 PHP SOAP Extension、中国語訳 PHP SOAP Extension。この記事を転載するにあたり、記事にコメントや私見を加え、例文も書き直したので、元の記事とは異なります。この記事のコードはすべて、将来読みやすくレビューしやすいようにメモ ウェアハウスに配置されます。 (この記事は GitHub にアーカイブされています)
PHP SOAP Extension
PHP SOAP Extension
PHP SOAP 拡張機能の詳細説明