基于PHP的cURL快速入门教程 (小偷采集程序)

2019-04-09 06:33:16丽君

// 14. 完了
curl_multi_close($mh);
echo "==Dead URLs==n";
echo implode("n",$dead_urls) . "nn";
echo "==404 URLs==n";
echo implode("n",$not_found_urls) . "nn";
echo "==Working URLs==n";
echo implode("n",$working_urls);
// 15. 向批处理器添加url
function add_url_to_multi_handle($mh, $url_list) {
    static $index = 0;
    // 如果还剩url没用
    if ($url_list[$index]) {
        // 新建curl句柄
        $ch = curl_init();
        // 配置url
        curl_setopt($ch, CURLOPT_URL, $url_list[$index]);
        // 不想输出返回的内容
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // 重定向到哪儿我们就去哪儿
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        // 不需要内容体,能够节约带宽和时间
        curl_setopt($ch, CURLOPT_NOBODY, 1);
        // 加入到批处理器中
        curl_multi_add_handle($mh, $ch);
        // 拨一下计数器,下次调用该函数就能添加下一个url了
        $index++;
        return true;
    } else {
        // 没有新的URL需要处理了
        return false;
    }
}

下面解释一下以上代码。列表的序号对应着代码注释中的顺序数字。

    新建一个批处理器。Created a multi handle. 稍后我们将创建一个把URL加入批处理器的函数 add_url_to_multi_handle() 。每当这个函数被调用,就有一个新url被加入批处理器。一开始,我们给批处理器添加了10个URL(这一数字由 $max_connections 所决定)。   运行 curl_multi_exec()  进行初始化工作是必须的,只要它返回 CURLM_CALL_MULTI_PERFORM 就还有事情要做。这么做主要是为了创建连接,它不会等待完整的URL响应。 只要批处理中还有活动连接主循环就会一直持续。 curl_multi_select() 会一直等待,直到某个URL查询产生活动连接。 cURL的活儿又来了,主要是获取响应数据。 检查各种信息。当一个URL请求完成时,会返回一个数组。 在返回的数组中有一个 cURL 句柄。我们利用其获取单个cURL请求的相应信息。 如果这是一个死链或者请求超时,不会返回http状态码。 如果这个页面找不到了,会返回404状态码。 其他情况我们都认为这个链接是可用的(当然,你也可以再检查一下500错误之类...)。 从该批次移除这个cURL句柄,因为它已经没有利用价值了,关了它! 很好,现在可以另外加一个URL进来了。再一次地,初始化工作又开始进行... 嗯,该干的都干了。关闭批处理器,生成报告。 回过头来看给批处理器添加新URL的函数。这个函数每调用一次,静态变量 $index 就递增一次,这样我们才能知道还剩多少URL没处理。
相关文章 大家在看