共1页 第1页 搞定PHP的WEBservice,尤其是BT的WSDL
Webservice要说是个好东西,在不同类型的语言 PHP、JSP、.net啥的都能用,可惜PHP对其支持一直不好。
好歹PHP5是完全支持SOAP了,可惜没提供容易生成WSDL的东东。
non-WSDL模式倒是很容易就调试成功了。可惜只能在PHP脚本之间交互,起码目前我还不知道怎么用JSP或者.net来调用PHP的non-WSDL模式的资源。
好容易一个伙计在网上找到一个能自动生成WSDL的类,一装还真的成功了。
接下来的一场噩梦却就此开始了:
1、这个类在有些机器上能用,有些机器上不能用
2、有时候只能调用类里第一个方法
把这个问题解决的过程,基本把wsdl模式的运作细节摸清楚了…… 阅读次数:12320 2011-2-24 20:44@0
续1
续写:搞定PHP的WEBservice,尤其是BT的WSDL
我用这样的客户端来测试
$client = new SoapClient(“wsdl地址",array('trace' => 1));
echo("SOAP服务器提供的开放函数:");
echo('<pre>');
var_dump($client->__getFunctions());
echo('</pre>');
echo("SOAP服务器提供的Type:");
echo('<pre>');
var_dump($client->__getTypes());
echo('</pre>');
echo $client->add(1,2);
奇怪的是本机测试一般都正常,上传服务器就开始运行出错。可恶的是直接在浏览器里看那一堆古怪的wsdl文件也正常,$client->__getFunctions()) 也正常。。。。就是调用函数时出错。。。而且错的一塌糊涂,先是不反应,过好长时间后报错,
有说‘Error Message: Error Fetching http headers'的,也有说XML文件无法解析的……
2011-2-24 21:03@0
续2
续写:搞定PHP的WEBservice,尤其是BT的WSDL
网上搜下,有说用PHP 4时代的nusoap的,有说用ZendStdio来做WSDL的,总之和我的情况不靠谱。
实在没辙了抓包---
在服务器一侧测试到客户机送出请求,但是却没有响应了
更奇怪的是删除所有防火墙规则后一切正常了,Webservice跑在80端口,防火墙明明放开了的。
用Non-WSDL模式一切正常。
有一台机器根据某网上文章讲法在/etc/hosts下加上
127.0.0.0.1 xxx.xxx.xxx 后正常了
深入分析下PHPservice脚本,慢慢发现端倪 2011-2-24 21:08:10编辑 2011-2-24 21:07@0
续3
续写:搞定PHP的WEBservice,尤其是BT的WSDL
服务的主文件其实也很简单:
require_once 'main.class.php';
if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD']=='POST') {
$servidorSoap = new SoapServer('http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF'].'?wsdl');
$servidorSoap->setClass('ShangDu'); //和类名要一致。
$servidorSoap->handle();
}
else {
require_once 'SoapDiscovery.class.php';
// Crea el servidor de descubrimiento
$disco = new SoapDiscovery('ShangDu','ShangDu_SP');
header("Content-type: text/xml");
if (isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'],'wsdl')==0) {
echo $disco->getWSDL();
}
else {
echo $disco->getDiscovery();
}
当用浏览器直接看的时候,走的是else后面一块,以前还以为这部分有问题,但是实际要看出生成的xml文件有没有问题是需要很深功力的。
山穷水尽,突然在服务器本机ping了一下自己的IP发现不通。
2011-2-24 21:12:06编辑 2011-2-24 21:11@0
续4
续写:搞定PHP的WEBservice,尤其是BT的WSDL
问题出在
$servidorSoap = new SoapServer(……)
这句上,它第一次调用时要自己调用自己的wsdl部分,也就是else后面那块生成wsdl文件
由于服务器机器的防火墙导致自己访问自己不通,所以挂在这里了,30秒超时后服务器PHP脚本退出
客户机收到出错信息想按照XML来解析自然就出错了。
这就好办了,服务器防火墙的确配置了除了访问80端口外其他都屏蔽,打击面太大把自己屏蔽了
在Linux下用iptables加一句解决问题:
iptables -I INPUT 1 -i lo -j ACCEPT
后来发现只要第一次调用成功后,会在/tmp下生成一个wsdl-xxxx的文件,作为soap的缓存,以后调用就不会重新生成了,这一点是我想再现故障现场时发现的。
至于有时候只能调用第一个方法的问题,是发现要是使用
http://xx.xx.xx/xxx?wsdl 就会出现这样的问题,写全:http://xx.xx.xx/xxx/index.php?wsdl 就没事了,怪异。
问题解决了就好办了----
这个很有用的类下载地址:http://www.huliang.com/test/soap.rar
2011-2-24 21:18@0
续5
续写:搞定PHP的WEBservice,尤其是BT的WSDL
突然想起,只能访问第一个方法的原因是:
第二个方法是后来加的,而原来只有一个方法的wsdl文件全部被服务器端和客户端缓存了,修改了类后再去调用时取不到最新的wsdl文件,于是只显示第一个方法。
换url,比如原来没写index.php现在写了后,系统就会生成一个新的wsdl文件,于是就可以访问了。
知道这点就好办了,在两侧服务器的/tmp里都把wsdl-开头的文件删掉,果然问题迎刃而解。
2011-2-24 21:31@0 共1页 第1页 评论:
网友1207:(11-2-25)代码都看不懂,我是来拜“程序帝”的,呵呵! tt99166:(11-6-9)我用的跟你是一套程序,同样出现很多问题,看了你的这么详细的帖子很激动啊!!多谢多谢!为了表示感谢专门注册了一个账号为了说这些话!加我QQ一起交流吧!qq:276919
短信评论请编辑PL2305+空格+内容发送到037160599922
河南联通用户可直接编辑评论内容发送到10656006002112305
以上短信端口不另收取信息费。
发表评论:
|