?
php?snoopy を使用してリモート データを取得する場合、リモート サイトの不安定性やネットワーク要因により、データの読み取りに失敗したり、応答時間が長くなるなどの問題が発生することがよくあります。この記事では、一般的な解決策に焦点を当てます。
少し前に、私たちは瀋陽交通違反照会ネットワークのインターフェースを使用して、簡単な違反照会システムを構築し、リモート取得前にデータをキャッシュしました。初期キャッシュ時間は3日に設定されていました(瀋陽交通違反のデータのため)。お問い合わせネットワーク 週に 1 回更新されます)。この作業は 3 か月近く続きましたが、交通警察チームのデータ ソースが 1 週間に 7 日のうち 2 日ほど不安定で、データにアクセスできなくなることがわかりました。ソースにアクセスできないことがよくあり、これにより待ち時間が長すぎ (約 30 秒)、最終的には空のクエリ結果が返されます。
?
この問題はユーザーエクスペリエンスに大きく影響します。解決策は次のとおりです。
1. インターフェースリクエストの状況を判断します。
2. 適切なタイムアウトを設定します。 (リモートサイトの応答速度にもよりますが、2~5秒程度で必ずデータが戻ってきます)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
?
?