您的位置:首页 > Web前端

【转】重新封装FetchUrl函数一枚,支持COOKIES,喜欢领走~!

2014-04-15 00:02 363 查看
mjj520 发表于 2012-6-2 09:14


唉 cpu超级耗芸豆的


查了下开发文档,fetchurl原来是不算CPU的,是我误导了大家。



发表于 2012-6-1 17:30:17 |只看该作者 |倒序浏览

分享到:

这里稍微说明,$url:访问路径;$post_fields:post的数组;$cookies_file:cookies文件存放的位置。
由于SAE的CURL估计与应用是不同一个层理运行的,所以cookies_file就失效了,SAE封装的fetchurl也是根据CURL重新封装的,但有BUG,例如如果访问的页面有跳转时,COOKIES是不能能跟随的,多以导致很多登录的页面无法实现登录。
本来打算用CURL重新封装,但为了节省时间还是,还是在SAE的fetchurl的基础上稍微修改吧,虽然这样浪费CPU资源,但估计不多可以忽略,就让CPU飞一会吧。
有些童鞋会问为什么非要用cookies_file,因为cookies跨页不能做跨页传递,而且也不能长时间保存,保存cookies_file可以跨页调用,也已长时间保存,设置可以跨应用,所以还是用cookies_file吧。

$cookie_file ='saestor://'.$DOMAIN/cookies.txt';
或者
$cookie_file ='saemc://cookies.txt';

切记不可以用本机路径。因为SAE不支持本地IO,上面的要打开stroge,下面的要打开memcahe,你懂的。

PHP代码

//new fetch

function new_fetch($url,$post_fields,$cookies_file){

$f = new SaeFetchurl();

if($post_fields==''){

$f->setMethod('GET');

}else{

$f->setMethod('POST');

}

$f->setAllowRedirect(false);

$f->setPostData($post_fields);

$cookies=unserialize(file_get_contents($cookies_file));//提取COOKIES

$f->setCookies($cookies);//设置COOKIES

$content=$f->fetch($url);

$cookies=mkcookies($cookies,$f->responseCookies());//模拟构造COOKIES

file_put_contents($cookies_file,serialize($cookies));//COOKIES序列化保存

$headers=$f->responseHeaders();

$location=$headers['Location'];

if($location<>''){//本来打算用HTTPCODE来判断的,结果总返回200,所以改用判断头是否有LOCATION

$url=$location;

$content=new_fetch($url,'',$cookies_file);

}

return $content;

}

再附上mkcookies的函数,也很无奈,fetchurl的responseCookies也太坑爹了,就算参数设置FALSE都还是不认识什么是COOKIE,返回些垃圾,只要重新处理下,并且模拟下浏览器对cookie的操作。

PHP代码

//处理COOKIES文件

function mkcookies($cookies,$newcookies){

foreach($newcookies as $cookie){

foreach($cookie as $key=>$value){

$cookies[$key]=$value;

break;

}

}

return $cookies;

}

以上表述不专业,请各位童鞋指教。



收藏5


转发到微博




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: