PHP 使用soap有兩種方式。
一、用wsdl文件
服務器端myservice.php
<?php
class service
{
public function HelloWorld()
{
return "Hello";
}
public function Add($a,$b)
{
return $a+$b;
}
}
$server=new SoapServer('soap.wsdl',array('soap_version' => SOAP_1_2));
$server->setClass("service");
$server->handle();
?> 資源描述文件,可以用工具(zend studio)生成。其實就是一個xml文件。
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://localhost/interface/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="soap" targetNamespace="http://localhost/interface/"> <wsdl:types> <xsd:schema targetNamespace="http://localhost/interface/"> <xsd:element name="HelloWorld"> <xsd:complexType> <xsd:sequence> <xsd:element name="in" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="HelloWorldResponse"> <xsd:complexType> <xsd:sequence> <xsd:element name="out" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Add"> <xsd:complexType> <xsd:sequence> <xsd:element name="in" type="xsd:int"></xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="AddResponse"> <xsd:complexType> <xsd:sequence> <xsd:element name="out" type="xsd:int"></xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> </wsdl:types> <wsdl:message name="AddRequest"> <wsdl:part name="a" type="xsd:int"></wsdl:part> <wsdl:part name="b" type="xsd:int"></wsdl:part> </wsdl:message> <wsdl:message name="AddResponse"> <wsdl:part name="c" type="xsd:int"></wsdl:part> </wsdl:message> <wsdl:portType name="TestSoap"> <wsdl:operation name="Add"> <wsdl:input message="tns:AddRequest"></wsdl:input> <wsdl:output message="tns:AddResponse"></wsdl:output> </wsdl:operation> </wsdl:portType> <wsdl:binding name="soapSOAP" type="tns:TestSoap"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="Add"> <soap:operation soapAction="http://localhost/interface/Add" /> <wsdl:input> <soap:body use="literal" namespace="http://localhost/interface/" /> </wsdl:input> <wsdl:output> <soap:body use="literal" namespace="http://localhost/interface/" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="TestSoap"> <wsdl:port binding="tns:soapSOAP" name="soapSOAP"> <soap:address location="http://localhost/interface/myservice.php"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
客戶端調用client.c
<?php $soap = new SoapClient('http://localhost/interface/soap.wsdl'); echo $soap->Add(1,2); ?>
以上是我從別人博客裏摘抄下來的,啓動運行了,得到結果3,沒問題,後面我在客戶端里加上echo $soap->HelloWorld();結果這句話報錯,找了好久,請高手幫忙,終於找到問題所在,原來是要把wsdl緩存給關閉,這個在調試的時候最後要關閉,真正做好了,不用修改了就可以把wsdl緩存打開。在php.ini中找到soap.wsdl_cache_enabled,默認是打開的,將其註釋掉即可,最後重啓web服務器。
wsdl文件的生成可以通過Zend Studio for Eclipse軟件生成,步驟如下:
第一步:新建工程
點擊file->new->php project,輸入文件名,和服務器的目錄一致,我用的apache,要使用的.php文件存放在/usr/local/apache/htdocs/interface目錄下,這裏就將文件名設爲interface。
第二步:新建.php文件
點擊file->new->PHP File,輸入文件名(myservice.php),接着輸入源代碼,記得要給每個函數加上註釋,這個通過在左窗口右擊對應的函數,選擇source即可自動生成。在左邊窗口中右擊myservice.php選擇export
第三步:生成wsdl文件
在browse中選擇interface,輸入要生成的wsdl文件名,如soap。
最後:修改wsdl中的變量類型
這樣就ok啦。
二、不用wsdl文件
服務器端
<?php
class service
{
public function HelloWorld()
{
return "Hello";
}
public function Add($a,$b)
{
return $a+$b;
}
}
$server=new SoapServer(null,array('uri' => "abcd"));
$server->setClass("service");
$server->handle();
?>
客戶端
<?php
try{
$soap = new SoapClient(null,array( "location" => "http://localhost/interface/soap.php", "uri" => "abcd", "style" => SOAP_RPC, "use" => SOAP_ENCODED ));
echo $soap->Add(1,2); }
catch(Exction $e)
{ echo print_r($e->getMessage(),true); }
?>
這種比較重要,當外網和外網服務器直接訪問,比如:通過自己的電腦訪問我帶3G網卡的板子時,就必須使用非wsdl方式,在wsdl方式中<soap:address location="http://localhost/interface/myservice.php"/> 通要填寫板子的ip,但是3G網卡的ip是動態變化的,這樣就很難通過第一種方式實現了。