`

解决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

 

 

分享到:
评论

相关推荐

    snoopy php来提取网页中你要的信息

    该库支持多种功能,包括但不限于获取网页内容、解析表单、提交数据等。Snoopy的使用非常简单直观,只需几行代码即可实现强大的网页抓取功能。 #### 安装与配置 在使用Snoopy之前,需要确保服务器环境安装了PHP,...

    php snoopy 模拟表单提交 数据抓取

    在PHP开发中,数据抓取是一项常见的任务,用于获取网页上的信息,比如新闻、产品详情或者用户评论等。Snoopy是一个PHP库,专门用于模拟浏览器行为,进行HTTP请求,尤其是处理表单提交和登录过程,从而实现网页数据的...

    php 下载远程图片

    Snoopy.class.php类提供了一种更灵活的方式来下载远程图片,特别是对于那些需要登录或者有特定头部信息的网站。 以下是如何使用Snoopy类下载远程图片的例子: ```php <?php require_once('Snoopy.class.php'); $...

    Snoopy.class.php类及中文说明

    总结来说,Snoopy.class.php是一个强大的PHP HTTP客户端工具,它的易用性和灵活性使其成为PHP开发者的得力助手,特别是对于需要处理网络请求和网页数据抓取的项目。配合中文说明,可以方便中文用户快速上手并高效地...

    用snoopy抓取EMS验证码,远程模拟查询单号,取得查询结果

    本话题将深入探讨如何利用Snoopy库来抓取EMS(中国邮政速递物流)的验证码,并远程模拟查询快递单号,从而获取查询结果。 首先,我们需要了解Snoopy类的基本用法。Snoopy类提供了HTTP GET和POST方法,可以设置...

    Snoopy

    Snoopy库允许开发者通过PHP代码发送GET、POST和其他HTTP请求,获取网页内容,这对于网页抓取、数据分析或者模拟登录等任务非常有用。 在PHP中,Snoopy类提供了丰富的功能,包括但不限于以下几点: 1. **HTTP方法...

    2014最新Snoopy.class.php

    Snoopy 是一个非常强大的PHP类,下面是详细介绍Snoopy.class.php源文件的内容。希望对大家有所帮助 Snoopy是一个php类,用来模拟浏览器...9提交数据并且获取返回值 10 支持跟踪HTML框架 11支持重定向的时候传递cookies

    Snoopy.class.php——登陆采集利器

    Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单。使用Snoopy来模拟登陆,然后采集登陆后的页面非常管用! Snoopy的特点: 1、抓取网页的内容 fetch 2、抓取网页的文本内容 (去除HTML标签) ...

    Snoopy.class.rar_Snoopy.class.php

    7. **编码处理**:Snoopy可以处理不同编码的网页,如GBK、UTF-8等,确保获取的数据正确无误。 8. **内容解析**:虽然Snoopy本身并不具备HTML解析能力,但可以与其他PHP解析库(如DOMDocument或SimpleXMLElement)...

    基于PHP的snoopy强大的PHP采集类源码.zip

    【标题】"基于PHP的snoopy强大的PHP采集类源码.zip" 提供的是一个用于网页数据抓取的工具,Snoopy是一个流行的PHP类库,专为处理Web抓取和模拟浏览器行为而设计。在PHP开发中,当需要从网站获取数据而没有提供API时...

    PHP抓取及过滤网站工具snoopy

    snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。 下面是它的一些特征: 1、方便抓取网页的内容 2、方便抓取网页的文字(去掉HTML代码) 3、方便抓取网页的链接 4、支持代理...

    PHP采集器Snoopy详解

    标题 "PHP采集器Snoopy详解" 描述的是一个用于PHP的网络数据抓取工具,名为Snoopy。Snoopy作为一个PHP类,其主要功能是模拟浏览器的行为,包括获取网页内容、处理表单提交等。它需要PHP版本在4以上,并依赖于PCRE...

    snoopy-2.0

    Snoopy-2.0,作为一个出色的网页数据采集类库,为这个过程提供了高效且便捷的解决方案。本文将深入探讨Snoopy-2.0的主要特性和应用场景,以及如何通过它来实现网页数据的抓取。 首先,Snoopy-2.0是一个基于Python...

    Snoopy:一个用来模拟浏览器的一些简单功能的php类库

    Snoopy是一个用来模拟浏览器的一些简单功能的php类,可以获取网页内容,发送表单等操作,Snoopy正确运行需要你的服务器的PHP版本在4以上,并且支持PCRE(Perl Compatible Regular Expressions),基本的LAMP服务都支持,由于...

    PHP实例开发源码—snoopy 强大的PHP采集类.zip

    【描述】中提到的"强大的PHP采集类"暗示了Snoopy类在数据抓取和解析方面具备高效和多功能性。它允许开发者编写简单的PHP脚本来抓取网页上的信息,这对于数据分析、内容聚合以及网站监控等场景非常有用。 **Snoopy类...

    基于PHP的snoopy 强大的PHP采集类.zip

    在Web开发中,数据抓取或网络爬虫是一项常见的任务,用于从网站上获取信息,分析网页内容,甚至构建搜索引擎。PHP作为流行的服务器端脚本语言,也拥有许多用于网络爬虫的工具,其中Snoopy是一个广受欢迎的选择。本文...

    snoopy手册中文版

    ### Snoopy 手册中文版知识点详解 #### 一、Snoopy简介 Snoopy是一款功能强大的PHP网络客户端库,适用于网页抓取任务。它能够帮助开发者轻松地从目标网站上提取信息,并具备多种特性来支持不同类型的网页数据抓取...

    snoopy1.2.4php

    描述中的“好像还可以作弊呢,呵呵”可能是指Snoopy类库可以用于一些巧妙的数据获取,例如在网站登录验证或访问限制的情况下,通过模拟浏览器行为来规避限制。这在合法且合规的前提下,可以为开发者提供便利,但同时...

    snoopy

    snoopy

    Snoopy.class.php

    snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。 Snoopy的一些特点: * 方便抓取网页的内容 * 方便抓取网页的文本内容 (去除HTML标签) * 方便抓取网页的链接 * 支持代理...

Global site tag (gtag.js) - Google Analytics