返回主页



狐说西游



掩码计算



分数引擎



蓍草算法



386YAO



15TO18



PHP手册



画二维码



共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模式的运作细节摸清楚了……

阅读次数:12321 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
以上短信端口不另收取信息费。

发表评论:
昵称: 密码:请用商都BBS账户登录
评论:
验证码:

附近BLOG

1:[围脖]今天再上一会班

2:[围脖]其实提前到除夕放假真的亏了一天……

3:[新浪围脖]卧铺车厢已经黑下来了……

4:[围脖]上班了……

5:[围脖]东风东路上的红绿灯……

now:搞定PHP的WEBservice,尤其是BT的WSDL

6:懒人懒办法,做个简单的PHP-WSDL-Webservice脚本

7:[新浪围脖]不能自动同步了……

8:终于下雪了

9:[围脖]听说新浪的同步接口好了……

10:[围脖]整了个二维码程序……


© 2025古钺青剑 保留一切权利  并承担一切责任
豫ICP备05009517号-3号