最近一直在使用curl,对curl的使用有了较深的认识,但是今天遇到一个问题,让寡人很是头疼啊。
老生长谈的需求了--就是session跨域,跨服务器共享
我就想着既然是共享,那必定要有交集--
1、session入库(数据库),两台服务器都去这个数据库读取数据就ok了
2、不入库,还是session写在文件中,一台服务器对另一台服务器开放一个获取session的接口不就完了
session入库不用说,绝对可行的,但是公司当前规模不大,秉着能省则省的原则,选择了第二种办法,这个方案的实施给了寡人;
首先我搭建了一个lnmp环境,模拟一台服务器,而本地wamp环境作为另一台服务器,看能不能本地获取到虚拟机里的session信息
第一步:get请求
使用curl发送get请求,获取session信息,木有一丁点问题,但是考虑到get请求,不安全,万一信息被劫持咋办?所以放弃
第二步:post
在使用post时,有点头大,一直提示400 Bad Request错误, 你大爷的,get好好的,咋一换post就不行了呢?
经过搜索,思考,终于找到了原因--原来curl在发送post请求时,有个严格的限制:post必须大写
好记性不如烂笔头,附录个代码,怕过几天忘记了
<?php
$url = "http://192.168.139.10/index.php";
$data = array('param'=>'abcs','act'=>'getname');
//发送请求
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//设置请求方式
curl_setopt($curl, CURLOPT_POST, 1);
//发送post数据
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); //传递参数
//curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
$result = curl_exec($curl);
curl_close($curl);
var_dump($result);
die;
$result = json_decode($result,true);
$user_name = decrypt($result['name'],'09wl2018');
var_dump($user_name);
/**
* @desc加密
* @param string $str 待加密字符串
* @param string $key 密钥
* @return string
*/
function encrypt($str, $key){
$mixStr = md5(date('Y-m-d H:i:s').rand(1000));
$tmp = '';
$strLen = strlen($str);
for($i=0, $j=0; $i<$strLen; $i++, $j++){
$j = $j == 32 ? 0 : $j;
$tmp .= $mixStr[$j].($str[$i] ^ $mixStr[$j]);
}
return base64_encode(bind_key($tmp, $key));
}
/**
* @desc解密
* @param string $str 待解密字符串
* @param string $key 密钥
* @return string
*/
function decrypt($str, $key){
$str = bind_key(base64_decode($str), $key);
$strLen = strlen($str);
$tmp = '';
for($i=0; $i<$strLen; $i++){
$tmp .= $str[$i] ^ $str[++$i];
}
return $tmp;
}
/**
* @desc辅助方法 用密钥对随机化操作后的字符串进行处理
* @param $str
* @param $key
* @return string
*/
function bind_key($str, $key){
$encrypt_key = md5($key);
$tmp = '';
$strLen = strlen($str);
for($i=0, $j=0; $i<$strLen; $i++, $j++){
$j = $j == 32 ? 0 : $j;
$tmp .= $str[$i] ^ $encrypt_key[$j];
}
return $tmp;
}
?>