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


    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代码 
    1. //new fetch
    2. function new_fetch($url,$post_fields,$cookies_file){
    3. $f = new SaeFetchurl();
    4. if($post_fields==''){
    5. $f->setMethod('GET');
    6. }else{
    7. $f->setMethod('POST');
    8. }
    9. $f->setAllowRedirect(false);
    10. $f->setPostData($post_fields);
    11. $cookies=unserialize(file_get_contents($cookies_file));//提取COOKIES
    12. $f->setCookies($cookies);//设置COOKIES
    13. $content=$f->fetch($url);
    14. $cookies=mkcookies($cookies,$f->responseCookies());//模拟构造COOKIES
    15. file_put_contents($cookies_file,serialize($cookies));//COOKIES序列化保存
    16. $headers=$f->responseHeaders();
    17. $location=$headers['Location'];
    18. if($location<>''){//本来打算用HTTPCODE来判断的,结果总返回200,所以改用判断头是否有LOCATION
    19. $url=$location;
    20. $content=new_fetch($url,'',$cookies_file);
    21. }
    22. return $content;
    23. }

    再附上mkcookies的函数,也很无奈,fetchurl的responseCookies也太坑爹了,就算参数设置FALSE都还是不认识什么是COOKIE,返回些垃圾,只要重新处理下,并且模拟下浏览器对cookie的操作。
    PHP代码 
    1. //处理COOKIES文件
    2. function mkcookies($cookies,$newcookies){
    3. foreach($newcookies as $cookie){
    4. foreach($cookie as $key=>$value){
    5. $cookies[$key]=$value;
    6. break;
    7. }
    8. }
    9. return $cookies;
    10. }
    以上表述不专业,请各位童鞋指教。


     
     
  • 相关阅读:
    20170822xlVBA ExportCellPhone
    【C/C++】C++ warning: control reaches end of non-void function return
    【C/C++】例题3-5 生成元/算法竞赛入门经典/数组与字符串
    对象类型的参数传递
    对象的创建和使用
    方法的重载
    构造方法
    方法
    修饰符
    类的一般形式
  • 原文地址:https://www.cnblogs.com/SummerRain/p/3665271.html
Copyright © 2020-2023  润新知