如何使基于curl的URL监控服务轻量化运行?

时间:2011-06-22 14:08:32

标签: php mysql performance curl cron

我目前正在构建一个用户面板,它将使用curl来抓取每日信息。对于每个URL,它将INSERT到数据库的新行。每个用户都可以添加多个URL进行抓取。例如:数据库可能包含1,000个用户,每个用户可能有5个URL平均可用。

如何在特定时间每天执行一次cron作业curl抓取?单个专用服务器是否会没有滞后?有没有减少服务器负载的技术?关于MySQL数据库:每天有5,000个新行,数据库将在一个月后变得庞大。

如果你想知道我正在建立一个统计服务,它会显示他们网页的日常增长(而不是谈论流量),所以据我所知,我需要每个用户每天插入一个新值。

任何建议都将受到赞赏。

3 个答案:

答案 0 :(得分:4)

5000 x 365只有180万...没有什么可担心的数据库。如果需要,可以将数据填入mongodb(需要64位操作系统)。这样,您可以在需要时更轻松地将负载扩展并随机扩展到多台计算机。

如果你想在从cron完成之前不停地运行curl,只需“好”这个过程,这样它就不会使用太多的系统资源。否则,您可以运行一个脚本,在每次卷曲拉动之间休眠几秒钟。如果每次刮擦需要2秒钟,这将允许您每24周刮掉4300页。如果你在2秒的拉力之间睡4秒就可以让你每天做14400页(5k是14.4k的40%,所以你应该在半天内完成,在2秒内刮4秒睡眠)。

这在第一年的最小VPS机器上看起来非常可行,至少在前6个月是这样。然后,您可以考虑使用更多的机器。

(编辑:如果你想要存储二进制GZIPPED抓取的页面源,如果你担心空间,也可以编辑)

答案 1 :(得分:3)

  1. 据我所知,每个客户的页面需要在每天的同一时间进行检查,以使增长统计数据准确无误。但是,是否需要同时检查所有客户?我会根据他们的ID将客户分成几块。通过这种方式,您可以每天在同一时间更新每个客户,但不必一次全部更新。

  2. 对于数据库大小问题,我会做两件事。首先,使用分区将数据分解为可管理的部分。其次,如果值从一天到下一天没有变化,我就不会为页面插入新行。在我处理数据时,我会推断出数据的值。除非您存储的是一小部分文本。然后,如果你对查询使用正确的索引和分页,我不确定行数是多么大的问题。

  3. 编辑:添加一些示例

    function do_curl($start_index,$stop_index){
    
        // Do query here to get all pages with ids between start index and stop index
    
        $query = "select * from db_table where id >= $start_index and id<=$stop_index";
    
        for($i=$start_index; $i<= $stop_index; $i++;){
    
             // do curl here
        }
    
    }
    

    网址看起来大致像

    http://xxx.example.com/do_curl?start_index=1&stop_index=10; http://xxx.example.com/do_curl?start_index=11&stop_index=20;

    处理不断增长的数据库大小的最佳方法是编写一个cron脚本,根据您需要获取的页数以及打算运行脚本的频率生成start_index和stop_index。

答案 2 :(得分:1)

使用多卷曲并正确优化不仅仅是规范化您的数据库设计。如果我要运行这个cron工作,我会尽量花时间研究是否有可能以大块的方式完成这项工作?关于使用平均配置的硬件启动,请继续监视它并增加硬件,CPU或内存。记住,没有银弹。