PHP写WebService
PHP中很少用到WebService,最近才研究了一下,似乎没有想象中复杂。1、Server端
定义一个类,在其中实现方法,然后用SoapServer将此类发布出去。
data_service.php:
[*]
也可以不用class,直接发布function。
[*]
2、Client端
client.php:
[*]
抓包看看:
[*]请求包:
[*]
[*]POST /test/data_service.php HTTP/1.1
[*]Host: 192.168.90.81
[*]Connection: Keep-Alive
[*]User-Agent: PHP-SOAP/5.4.3
[*]Content-Type: text/xml; charset=utf-8
[*]SOAPAction: "php.test#add"
[*]Content-Length: 512
[*]
[*]
[*]100800
[*]
[*]--------------------------------
[*]响应包:
[*]
[*]HTTP/1.1 200 OK
[*]Server: nginx/1.2.0
[*]Date: Thu, 07 Jun 2012 06:51:33 GMT
[*]Content-Type: text/xml; charset=utf-8
[*]Content-Length: 488
[*]Connection: keep-alive
[*]X-Powered-By: PHP/5.4.3
[*]
[*]
[*]900
需要注意,如果PHP是以FastCGI方式运行,且只启动了一个进程 ,由于php-cgi.exe的单线程模型,访问client.php时其又会向data_service.php发送请求,但当前请求未处理完毕,data_service.php无法响应,会造成卡死得不到结果。
比如nginx如果没有使用负载均衡,所有php请求都转发到同一个php-cgi进程,就肯定会卡死。请负载均衡到不同进程上,或者换用isapi模式。
使用这种方式没有定义wsdl,没想明白双方是如何约定通讯的。另外显然,用这种方式肯定无法跨语言访问服务,因为我们访问data_service.php?wsdl拿不到wsdl,返回如下:
[*]
[*]
[*]
[*] SOAP-ENV:Server
[*] WSDL generation is not supported yet
[*]
[*]
[*]
页:
[1]