【轉】從新封裝FetchUrl函數一枚,支持COOKIES,喜歡領走~!

 

mjj520 發表於 2012-6-2 09:14 
唉 cpu超級耗芸豆的


查了下開發文檔,fetchurl原來是不算CPU的,是我誤導了你們。php

 

 發表於 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. }
以上表述不專業,請各位童鞋指教。


 
 
相關文章
相關標籤/搜索