SOAP の原則と PHP の実装
1. はじめに:
SOAP: (正式名 Simple Object Access Protocol) は、データ交換のためのプロトコル仕様であり、HTTP の上に位置し、データ交換に XML 形式の言語を使用します。 使用シナリオ: 異なるプロジェクトが開発に使用される場合。データを交換するには、相互に通信できるツールが必要です。WSDL と SOAP は、このために生まれました。
WSDL: WSDL は、Web サービス記述言語を指し、XML で記述されたドキュメントです。このドキュメントでは Web サービスについて説明します。サービスの場所と、このサービスによって提供される操作 (またはメソッド) を指定します。
2. 構成:
PHP の SOAP 拡張機能の有効化と構成
WIN環境
PHP.ini extension=php_soap.dll を開き、先頭のセミコロンを削除します
Linux 環境
コンパイル時に --enable-soap
を追加しますWSDL キャッシュ タイプ 1 はディスク 2 はメモリです
soap.wsdl_cache = 1
キャッシュファイルの保存場所
soap.wsdl_cache_dir = /tmp
WSDL キャッシュ機能を有効または無効にします。SOAP を実行するたびに、相手の XML ドキュメントをダウンロードする処理が発生し、これも非効率の原因です。
soap.wsdl_cache_enabled =1
キャッシュされたファイルの最大数
soap.wsdl_cache_limit
キャッシュファイルの生存時間
soap.wsdl_cache_ttl = 3600
3. 応用例:
a. wsdl を使用しない場合
サーバー:
<span style="font-size:18px;"><?php class testclass{ public function getName($name) { return "hello ".$name; } } function getName($name) { return "hello ".$name; } $a = new SoapServer(null,array("uri"=>"index.php")); $a->setClass("testclass"); //指定一个类中的所有方法 //$a->addFunction("test"); //指定单个方法 $a->handle(); //处理访问</span>
uri は必須フィールドです。クライアントの URI はサーバーの URI と一致している必要があります
クライアント
<span style="font-size:18px;">try{ $client = new SoapClient(null, array("location"=>"http://localhost/instance/index.php","uri"=>"index.php")); //echo $client->getName("getName"); //调用方法 echo $client->__soapCall ("getName",array("name")); //调用方法 }catch(Exception $e){ print_r($e->getMessage(),true); }</span>
location は SOAP サーバーのアクセス アドレスであり、URI はサーバーと一致しています
b. WSDL メソッド
を使用します。
wsdl を使用する前に XML ファイルを手動で生成する必要がありますが、これを手動で記述するのは面倒すぎるため、SoapDiscovery.class.php のオープン ソース クラス生成を使用できます
ダウンロードアドレス
<span style="font-size:18px;"><?php class testclass{ public function getName($name) { return "hello ".$name; } } include_once "SoapDiscovery.class.php"; $discovery = new SoapDiscovery("testclass","testclass"); $filename = $discovery->getWSDL(); //生成XML文件 echo $filename;</span>
サーバー
<span style="font-size:18px;">$a = new SoapServer("testclass.wsdl"); $a->setClass("testclass"); //指定一个类中的所有方法 $a->handle(); //处理访问 </span>
クライアント
<span style="font-size:18px;">try{ $client = new SoapClient("http://localhost/instance/index.php?wsdl"); //echo <span style="font-family:Arial,Helvetica,sans-serif">$client</span>->getName("getName"); //echo <span style="font-family:Arial,Helvetica,sans-serif">$client</span><span style="font-family:Arial,Helvetica,sans-serif">->__soapCall ("getName",array("name"));</span> print_r(<span style="font-family:Arial,Helvetica,sans-serif">$client</span><span style="font-family:Arial,Helvetica,sans-serif">->__getFunctions()); //打印服务端所有提供的方法</span></span>
<span style="font-size:18px;">}catch(Exception $e){ print_r($e->getMessage(),true); }</span>
拡張クラスが提供するメソッドについては、PHP マニュアルを参照してください