以下代码是对Php的soap接口进行抓包分析出的结果,这个分析在当服务端或者客户端的Php没有安装soap模块时,可以使用构建xml的方式实现相同的功能。
php捕捉soap的xml形式,供初学者参考吧。
服务端代码:
$data = $HTTP_RAW_POST_DATA;
$data = file_get_contents('php://input');
$server = new SoapServer(null, array('uri' => "http://abc-soap-duba/"));
$server->addFunction("sendtask");
$server->handle($data);
function sendtask()
{
return "ok";
}
?>
客户端代码:
$client = new SoapClient(null, array('location' => "http://api.abc.cn/taskserver.php",
'uri' => "http://abc-soap-duba/"));
$username="cdn@abc.cn";
$password=md5("123456");
$domain="www.abc.cn";
$pathsizelist="/images/ad2.gif,4846,/images/ad3.gif,5788,/images/ico01.gif,1089,/images/logo.gif,1605";
echo $client->sendtask($username,$password,$domain,$pathsizelist);
?>
客户端发出的数据:
Host: api.abc.cn
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.2.2
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://abc-soap-duba/#sendtask"
Content-Length: 766
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://abc-soap-duba/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encoding>
<SOAP-ENV:Body>
<ns1:sendtask>
<param0 xsi:type="xsd:string">cdn@abc.cn</param0>
<param1 xsi:type="xsd:string">e10adc3949ba59abbe56e057f20f883e</param1>
<param2 xsi:type="xsd:string">www.abc.cn</param2>
<param3 xsi:type="xsd:string">/images/ad2.gif,4846,/images/ad3.gif,5788,/images/ico01.gif,1089,/images/logo.gif,1605</param3>
</ns1:sendtask>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
当server中没有改函数时返回的结果:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:Server</faultcode><faultstring>Function 'sendtasks' doesn't exist</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
当server中有该函数时的结果:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://abc-soap-duba/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encoding>
<SOAP-ENV:Body>
<ns1:sendtaskResponse>
<return xsi:type="xsd:string">ok</return>
</ns1:sendtaskResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
网站出现一个bug,页面头部出现乱码,而其它地方正常,头部是include一个head.php,整个页面是utf8的,但是我把head.php打开看,它就是用utf8方式保存的,把其它正常的文件拷贝,填入head.php的内容还是不行。
最后是用linux,vi一个head.php,输入测试两个字发现显示正常。
于是把head.php下载下来,用ue32打开,把内容填入,结果页面显示正常,估计是utf8文件头的问题:
这个正常文件没有utf8的EFBB。
正常:
异常:
您可能感兴趣的文章:
php函数substr截取中文字符出现乱码的解决方法
php substr截断中文半个汉字乱码问题的解决方法
php乱码问题 utf8乱码杂谈
php截取中文字符串乱码如何解决呢
php分割GBK中文乱码的解决方法
解决php截取utf-8中文字符串时乱码的问题
如何解决php中文字符乱码,中文字符入库乱码的问题
php中文字符串截断且无乱码的解决方法
有关php中文乱码的解决方法
最近新开发了一个项目,由于使用到了4台机器做web,使用dns做负载均衡,
如上图所示,用户通过DNS的调度(一个域名对应多个ip)分别访问到VM2-VM5上,四台机器都访问VM1上的redis,两个redis值主从结构。
因此需要使用跨服务器的session保存用户登录状态,于是便写了一个跨站的session共享的类。
/*
*用redis实现跨服务器session
*注意需要安装phpredis模块
*
*作者:yifangyou
*日期:2012-07-23 22:55:00
**/
class RedisSession{
var $expire=86400;//过期时间
var $sso_session;//session id
var $session_folder;//session目录
var $cookie_name;//cookie的名字
var $redis;//redis连接
var $cache;//缓存session
var $expireAt;//过期时间
/*
*初始化
*参数
*$redis:php_redis的类实例
*$cookie_name:cookie的名字
*$session_id_prefix:sesion id的前缀
**/
function RedisSession($redis,$expire=86400,$cookie_name="sso_session",$session_id_prefix=""){
$this->redis=$redis;
$this->cookie_name=$cookie_name;
$this->session_folder="sso_session:";
//若是cookie已经存在则以它为session的id
if(isset()($_COOKIE[$this->cookie_name])){
$this->sso_session=$_COOKIE[$this->cookie_name];
}else{
$this->expire=$expire;
$this->expireAt=time()+$this->expire;
//在IE6下的iframe无法获取到cookie,于是我使用了get方式传递了cookie的名字
if(isset($_GET[$this->cookie_name])){
$this->sso_session=$_GET[$this->cookie_name];
}else{
$this->sso_session=$this->session_folder.$session_prefix.md5(uniqid(rand(), true));
}
setcookie($this->cookie_name,$this->sso_session,$this->expireAt,"/");
}
}
/*
*设置过期时间
*参数
**/
function expire($expire=86400){
$this->expire=$expire;
$this->expireAt=time()+$this->expire;
//设置session过期时间
setcookie($this->cookie_name,$this->sso_session,$this->expireAt,"/",".greatwallwine.com.cn");
$this->redis->expireAt($this->sso_session, $this->expireAt);
}
/*
*设置多个session的值
*参数
*$array:值
**/
function setMutil($array){
$this->redis->hMset($this->sso_session,$array);
}
/*
*设置session的值
*参数
*$key:session的key
*$value:值
**/
function set($key,$value){
$this->redis->hSet($this->sso_session,$key,$value);
}
/*
*设置session的值为对象
*参数
*$key:session的key
*$object:对象
**/
function setObject($key,$object){
$this->redis->hSet($this->sso_session,$key,serialize($object));
}
/*
*获取全部session的key和value
@return: array
**/
function getAll(){
return $this->redis->hGetAll($this->sso_session);
}
/*
*获取一个session的key和value
@return: array
**/
function get($key){
return $this->redis->hGet($this->sso_session,$key);
}
/*
*获取session的值为对象
*参数
*$key:session的key
*$value:cookie的名字
**/
function getObject($key){
return unserialize($this->redis->hGet($this->sso_session,$key));
}
/*
*从缓存中获取一个session的key和value
@return: array
**/
function getFromCache($key){
if(!isset($this->cache)){
$this->cache=$this->getAll();
}
return $this->cache[$key];
}
/*
*删除一个session的key和value
@return: array
**/
function del($key){
return $this->redis->hDel($this->sso_session,$key);
}
/*
*删除所有session的key和value
@return: array
**/
function delAll(){
return $this->redis->delete($this->sso_session);
}
}
?>
使用方法:
<?php
error_reporting(0);
$redisHost="192.168.1.2";
$redisPort="6379";
$redis = new Redis();
$redis->connect($redisHost,$redisPort);
include_once("inc/RedisSession.php");
$redisSession=new RedisSession($redis);
/*
$redisSession->set("name","sdf4");
$redisSession->set("age",1234);
$redisSession->set("***","man14");
$redisSession->set("name","abc4");
$redisSession->setMutil(array("province"=>"guangdong","city"=>"guangzhou"));
*/
$redisSession->setObject("obj",array("test1"=>array("test2")));
$obj=$redisSession->getObject("obj");
print_r($obj);
die();
print_r($redisSession->getAll());
//$redisSession->del("name");
print_r($redisSession->get("name"));
//print_r($redisSession->get("province"));
//$redisSession->delAll();
//print_r($redisSession->getAll());
print_r($redisSession->getFromCache("name"));
/*
$redisSession->del("name");
$redisSession->delAll();
*/
比较常用的估计是set,get,setObject,getOject。
我用sso_session:主要是方便用phpRedisAdmin管理。