(╯-_-)╯╧╧
一上来掀桌要闹哪样…嘛,其实跟SOAP无关, 而是C#
C# 提供的 Web Services 方案坑死了多少非 C# 的程序员不得而知.. 只是觉得这个好麻烦啊好麻烦…
基础知识请自行百科.

(还有很多百度的大神们, 注意你们的文章是否是针对Web Services的, 它与SOAP是完全不一样啊!

简单地说, 一个客户端的 Web Client 要请求 Web Service 仅仅是通过 XML+SOAP 去完成通信.
但在开发的时候, 就需要另一个东西对该 Web Service 的功能/参数等等进行约束.
这就是 WSDL. WSDL 通常是由一个 UDDI 发布端进行更新或维护.
(至于WSDL变更后是否会验证, 就请各位自行测试了.
也就是说, 作为PHP端, 既要作为一个 服务管理者 又要做一个 数据提供者. 以上.

一. 发布WSDL

这里我们需要一个大神写的WSDL简易发布工具.
NuSOAP ? 不不, 这货网上已经泛滥了, 我就不多说了, 虽然是一个很完整的 WebServices 方案.
但我认为过于复杂的Method注册, 让我们除非做正规的带文档的接口, 否则很难用它.
正如如果没有过分要求的时候, 导入Excel, 我更偏向于要求用户导入csv文件, 而不是用复杂的PHPExcel去解析..

下面隆重推荐:
SoapDiscovery
代码很少, 并且2005年就完成了… 简单的从头看到尾也是没有问题的..
那时候估计也没什么Github / google code 吧…所以作者一直也没提交源..
点击这里下载..

载入这个类之后, 我们就可以这样来动态生成我们的 WSDL 了


//wsdl.php
include_once './SoapDiscovery.class.php';
$wsdl = new SoapDiscovery('[ClassName]','[ServerName]');
echo $wsdl -> getWSDL();

其实这个类只是利用了ReflectionClass, 来快速生成了WSDL, 其实如果使用NuSOAP也可以写一个简单的方法进行处理.
[ClassName]是作为Soap的类名 (当然,这个类要存在而且已被加载 , [ServerName]则随意.

二. 形成Service


//server.php
if(isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD']=='POST')
{
	// 正式的数据请求
	$Server = new SoapServer("http://localhost/wsdl.php");
	$Server -> setClass("[ClassName]");
	$Server -> handle();
}
else
{
	// 从C#读取wsdl时, 或者上面 SoapServer 需要读取 wsdl 时
	include 'wsdl.php';
	exit;
}

这样我们的简易 Web Services 就完成了. 记住 ClassName 的那个类的方法, 需要 return 返回数据, 不要用 echo 等…