* 1、协调crawler和parser工作 * 2、由于swoole的特殊性,所有是回调函数的形式 * 3、定义了监控器 * **/ //定义一些全局变量 global $crawler_monitor, $parser_monitor, $redis, $crawler_server, $parser_server, $crawler_topic, $parser_topic, $start; //加载site配置,里面包含了要抓取的网站列表及相应的配置,请看测试实例 $site = Loader::load_config('site'); if (!$site && !isset($site['urls']) && !$site['urls']) { exit('没有定义要抓取的网站列表'); } else { $urls = is_array($site['urls']) ? $site['urls'] : array($site['urls']); } //初始化redis $redis = init_redis(); $crawl_keys = $parse_keys = array(); //把要抓取的网站添加的要监控的队列 foreach ($urls as $url) { preg_match('/http:\\/\\/[^\\/]+[\\/]?/i', $url, $match); if (!$match) { continue; } $key = md5(trim($match[0], '/')); /** * $start 参数 * 1、因为本系统必须启动连个server才能完成想要的效果 crawer_server 和 parser_server * 2、每次启动server都会加载该文件 * 3、避免重复放入队列(比如第一次在队列中时,我们的crawer_server已经抓取过了,如果重复放入,则会重复抓取) **/ if ($start) {
function host_to_ip($host) { $redis = init_redis(); $key = 'dnscachehost_to_ip'; $ips = array(); if (!($ips = $redis->hget($key, md5($host)))) { Loader::load('lib.dns.DNSRecord'); $records = DNSRecord::get_records($host); if ($records) { $ips = serialize(array_column($records, 'ip')); } } if ($ips) { $redis->hset($key, md5($host), $ips); $ips = unserialize($ips); return $ips[rand(0, intval(count($ips) - 1))]; } }