解決php snoopy遠程擷取資料的穩定性問題
?
使用php?snoopy在擷取遠端資料的時候,經常遇到遠端站台不穩定或者是網路因素影響,造成讀取資料失敗或者返回時間過長的問題,本篇文章著重介紹一下大致的解決思路。
前段時間利用瀋陽交通違章查詢網的介面,做了一個簡單的違章查詢系統,並且在資料遠程擷取之前進行了緩衝,開始設定的緩衝時間為3天(因為瀋陽交通違章查詢網的資料每周更新一次)。這樣運行了將盡3個月的時間,通過長時間的觀察,發現交警隊的資料來源並不穩定,一周7天大約有2天網站是處於無法訪問的狀況,在緩衝失效的情況下,經常會造成等待時間過長(大約30s),最後返回為空白查詢結果的問題。
?
這個問題非常影響使用者體驗,我也考慮了很長時間,解決思路如下:
1.對介面請求情況進行判斷;
2.設定合理的逾時時間。(根據遠端站台響應速度,大約2-5s肯定會返回資料)
3.將最後一次成功查詢結果寫入資料表,介面失效的時候調用最後一次成功查詢記錄。
?
綜合以上幾點方法,基本可以解決這個問題。運行流程如下:
1.使用者輸入資訊並提交查詢請求
2.伺服器端檢測該查詢資料是否緩衝並有效,如果存在並有效則直接返回(最剩資源,不用去遠程擷取)
3.如果緩衝不存在或者失效,則調用遠程擷取方法
4.遠程擷取方法使用php?snoopy進行擷取遠端資料,這裡需要設定逾時時間以及判斷返回狀態和是否逾時。
$snoopy = new Snoopy;$snoopy->read_timeout=4; //讀取逾時時間
?
if ($snoopy->status>0&& $snoopy->status== '200' && !$snoopy->timed_out) { //這裡是讀取成功的處理邏輯}else{ //這裡是遠程介面出問題的時候的處理邏輯}
?首先說明一下,$snoopy->status是遠程返回的狀態代碼,成功返回的應該是200,其他情況下返回的都應該是錯誤的,並且有效請求狀態應該是大於0的,$snoopy->timed_out在未逾時的情況下值為false,如果讀取請求逾時的話,傳回值應該為true。
5.如果介面請求不逾時,直接進行最新的資料處理,並刪除該資料有關的最後一次查詢結果,並將最新的查詢結果寫入資料庫。
/** * 寫入最後一次查詢記錄 * @param type $cache_data 傳遞過來的最新查詢結果 */ private function write_last_info($cache_data){ $car_info=$cache_data['car_info']; $M=M('SyCar'); $info=$M->where("wz_car_no='{$car_info['wz_car_no']}'")->find(); if(empty($info)){ $car_info['wz_datetime']= get_date_full(time()); $car_info['wz_car_memo']= session('memo'); $M->add($car_info); }else{ if($info['wz_car_memo']!=session('memo')){ $info['wz_car_memo']=session('memo'); $M->save($info); } } unset($info); unset($M); $M=M('SyCarlastweizhang'); $M->where("wz_car_no='{$car_info['wz_car_no']}'")->delete(); foreach ($cache_data['weizhang_info'] as $key => $value) { $value['wz_car_no']=$car_info['wz_car_no']; $value['input_time']= get_date_full(time()); $M->add($value); } unset($M); unset($cache_data); unset($M); }
?6.在遠程介面擷取失敗的情況下,讀取最後一次查詢的結果
$weizhang_info=M('SyCarlastweizhang')->where("wz_car_no='{$car_no}'")->order("wz_datetime")->select();if(empty($weizhang_info)){ $is_cache=false; $pop_info='遠端資料擷取失敗,請您稍後在進行查詢!'; } $cache_data = array( 'pop_info' => $pop_info, 'car_info' => $car_info, //擷取遠端返回的汽車資訊 'weizhang_info' => $weizhang_info, //擷取遠端返回的違章記錄數組 );
?順便說一下,如果在最後一次查詢結果的表中,該查詢資訊也不存在的話,那麼只能遺憾的返回"遠端資料擷取失敗,請您稍後在進行查詢"的錯誤提示了。?其實這個地方也可以輸出其他的提示句。?
?
該篇文章已經基本上解決了遠端站台介面不穩定影響的使用者體驗問題,更完善的處理邏輯還需要繼續進行完善。希望該文章思路能對您有所協助。
FROM:http://www.9it.me/article-128.html
?
?