PHP执行采集任务,程序写的步骤是
1.先从数据库中提取出url,
2.php远程获取URL标题title,通过http下载远程网址。
3.下载完之后下载另外一个网站B的数据,http。
4.下载完之后再次下载另外一个站C的数据,http。
5.每条记录总共下载远程四个网站A、B、C、D的数据后更新数据表的对应记录,然后循环下一条记录。
结果的现象是:
如果刷新一次页面一次10条都一直在加载,但是却始终都没有完成一条(三个小时候过去了,一条都没有完成)。
但是如果每次只操作一条,却很快的就完成了。一直难以明白,代码都没有改过。

解决方案 »

  1.   

    运行环境远程的虽然每条记录都要获取四个网站,B、C、D三个网站是可以打开的,A网站就是记录本身的那个网站,可能不一定可以打开或者是不存在的。但是很慢,如果批量操作,几个小时过去了还是一个都没有完成,只能每次只操作一条,然后再刷新浏览器下一条。
      

  2.   

    是否是php超时了或者内存满了?是否打开error.log查看下错误日志呢?写这种采集程序,最重要的是判断程序运行错误的时候怎么处理。
      

  3.   

    在每一个都写log入文件,看到哪一步停止了。
      

  4.   


    没有停止,就是很慢,统计出来的都是远程获取这里非常慢。如果对方网站有time out,那更会慢。但是如果一条条的请求就还勉强不超过10s(如果对方网站快的话那就不超过1s)。
    用的是dedecms的下载的类。php的fsocket的-- ORDER BY alltaken DESC +-----+---------------------------------+----------------+--------------+--------------+---------------+--------------+----------------+
    | id  | CONCAT(LEFT(indexurl,8),'****') | siteA          | BsiteUse     | CsiteUse     | DsiteUse      | SelfsiteUse  | alltakenS      |
    +-----+---------------------------------+----------------+--------------+--------------+---------------+--------------+----------------+
    | 116 | http://w****                    | 312.6209980000 | 0.1027460000 | 0.7083260000 |  0.1019220000 | 0.0001310000 | 313.5347100000 |
    | 192 | http://b****                    | 131.7439090000 | 0.1065950000 | 0.1032040000 |  0.1218960000 | 0.0001460000 | 132.0764180000 |
    | 208 | http://p****                    | 129.1037910000 | 0.1067140000 | 1.9131520000 |  0.0999170000 | 0.0001550000 | 131.2365740000 |
    | 274 | http://w****                    | 128.9867080000 | 0.0914060000 | 0.2133490000 |  0.0072880000 | 0.0001290000 | 129.2995460000 |
    |  72 | http://w****                    | 121.8476540000 | 0.3580050000 | 0.8115200000 |  0.1271520000 | 0.0001290000 | 123.1452500000 |
    | 136 | http://b****                    | 120.3886700000 | 0.0976120000 | 1.2840520000 |  0.2518970000 | 0.0001520000 | 122.0230590000 |
    | 133 | http://b****                    | 105.1644020000 | 0.1114830000 | 0.1085140000 |  0.1326280000 | 0.0001610000 | 105.5177820000 |
    |  42 | http://w****                    | 104.3177670000 | 0.1232750000 | 0.2724820000 |  0.1189370000 | 0.0001350000 | 104.8334620000 |
    | 120 | http://s****                    |  65.3187010000 | 0.2496840000 | 1.4335560000 |  0.1150520000 | 0.0001540000 |  67.1178350000 |
    | 278 | http://b****                    |  61.1772180000 | 0.1108920000 | 0.2042260000 |  0.1191600000 | 0.0001710000 |  61.6123010000 |
    | 132 | http://b****                    |  60.5103830000 | 0.1067460000 | 0.0922900000 |  0.1117640000 | 0.0001430000 |  60.8220210000 |
    | 123 | http://w****                    |  10.3734350000 | 0.0937580000 | 0.1644970000 | 40.6561520000 | 0.0001400000 |  51.2885540000 |
    |  53 | http://w****                    |  38.1353850000 | 0.1011540000 | 0.2341760000 |  0.1139470000 | 0.0001320000 |  38.5854690000 |
    | 122 | http://w****                    |  26.4192670000 | 0.0918600000 | 1.2295260000 |  0.1289520000 | 0.0001490000 |  27.8703320000 |
    |  87 | http://w****                    |  20.5397840000 | 0.1029720000 | 2.3649450000 |  0.1102360000 | 0.0001370000 |  23.1189480000 |
    +-----+---------------------------------+----------------+--------------+--------------+---------------+--------------+----------------+
    15 rows in set (0.03 sec)
      

  5.   


    用的是DEDECMS的下载类。socket方式的。文件全部源码如下:
    因为写不下,所以发链接:http://blog.csdn.net/default7/article/details/8333410
    用到的地方是这里:fsockopen
        /**
         *  打开连接
         *
         * @access    public
         * @return    bool
         */
        function PrivateOpenHost()
        {
            if($this->m_host=="")
            {
                return FALSE;
            }
            $errno = "";
            $errstr = "";
            $this->m_fp = @fsockopen($this->m_host, $this->m_port, $errno, $errstr,10);
            if(!$this->m_fp)
            {
                $this->m_error = $errstr;
                return FALSE;
            }
            else
            {
                return TRUE;
            }
        }
      

  6.   

    哪里的服务器?先别解析一下DNS。
      

  7.   


    本地测试的,PHP采集网址indexurl的charset编码和<title>的内容,siteA就是这个indexurl对应的网站的。现在认为是indexurl这个对应的网站服务器不行导致的。现在只能用每次采集一条的方法了。
      

  8.   

    我是说siteA,也是本地的?先别采集。直接运行siteA的相应脚本,需要多少时间?
      

  9.   


    siteA就是那个indexurl对应的那个网站的。
    6#楼中 “SelfsiteUse ”就是localhost本地函数运算所需要花费的。
      

  10.   

    你没有给出具体的代码,不能给出具体的建议
    不过就是给出了代码,也不一定有心情去看和测试
    对此类应用提点我哥个人意见:
    1、通常页面中都有返回到首页,返回到栏目之类的连接。
      应注意排除,否则极易造成死循环
    2、页面采集程序应是单一的
      即运行一次,采集一个页面
    3、采集控制程序用于调度页面采集程序
      可用 fsockopen 打开 页面采集程序 后即可返回,目标页url只作为参数传递给页面采集程序
      这样可就模拟了一个多进程系统
    4、具体是实现时以数据库为中介,所有从页面中析出的url都入库(当然要排重)
      采集控制程序读取数据库,以决定是否继续采集和每次采集的规模
      

  11.   

    换个类试试,不要用dedecms集成的。
    网上找一下类似功能的function或者CLASS。
      

  12.   


    其实的discuz的curl 和 fsocket也不行,会被有的服务器判断出来是非正常访问。只有dede的那个类成功的最多。。其他的也试了,也是很慢!
    还是采用每次采集获取一条的方法比较好一点。
      

  13.   


    内牛满面....师兄你成仙了啊~~自己写个采集的curl 封装一下 有多难哪...采集其实麻烦就麻烦在各种正则上的分析校对.
      

  14.   

    就是,二次开发没那么难。你到底要怎么样的功能?把URL和要求贴出来,帮你写一个function。
      

  15.   


    用的是dede的 /include/dedehttpdown.class.php采集的类。测试了很多,感觉跟对方服务器的性能有很大关系。有的域名很快,基本上可以忽略时间有的就非常卡(但是有的卡的他的域名直接使用浏览器是打开很快的)。很奇怪的问题。另外一个问题是有的域名他指向的主机是不存在的,然后程序一直在不停的执行直到超时,APACHE和CPU全都占用卡死了。后来设置了time_limit 为20,貌似缓解了不少。(用的是fsockopen)听说过那个stream创建的可以中断请求(如果对方服务器有问题的话),不过没有用,不清楚如何使用。dedehttpdown.class.php下载类:
    http://blog.csdn.net/default7/article/details/8512294
      

  16.   

    网络问题是影响采集速度的最主要原因。
    你先ping一下,看看响应时间是多少。别用dedecms的那个类,自己用curl写个,很简单的。
    给每个请求设置timeout。别拿自己的pc机跑,找一台配置高的服务器去跑,开多个进程,把你的任务分类,这样可以提高好几倍的效率。
      

  17.   

    给出这些域名,是不是有头部跳转,或者去掉www看看。
      

  18.   

    其实是和采集程序有关。dedecms自带的dedehttpdown其实效率很低,不过有一个特点是防采集的网站却可以采集过来!