PHP-cURL多线程模拟并发请求

钱是买不到幸福的, 因为他本身就是幸福

PHP cURL所有函数列表:

http://php.net/manual/zh/ref.curl.php]http://php.net/manual/zh/ref.curl.php

以下是PHP中cURL多线程相关函数:

1
2
3
4
5
6
7
8
9
10
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄
curl_multi_close — 关闭一组cURL句柄
curl_multi_exec — 运行当前 cURL 句柄的子连接
curl_multi_getcontent — 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的cURL的相关传输信息
curl_multi_init — 返回一个新cURL批处理句柄
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — 等待所有cURL批处理中的活动连接
curl_multi_setopt — 为 cURL 并行处理设置一个选项
curl_multi_strerror — Return string describing error code

一般来说,想到要用这些函数时,目的显然应该是要同时请求多个URL,而不是一个一个依次请求,否则不如自己循环去调curl_exec好了。

步骤总结如下:

1、调用curl_multi_init,初始化一个批处理handle
2、循环调用 curl_multi_add_handle,往1中的批处理handle 添加curl_init来的子handle
3、持续调用 curl_multi_exec,直到所有子handle执行完毕。
4、根据需要循环调用 curl_multi_getcontent 获取结果
5、调用 curl_multi_remove_handle,并为每个字handle调用curl_close
6、调用 curl_multi_close

以下是一个通过并发请求抓取网页的demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
$urls = array(
'https://979137.com/',
'http://www.sina.com.cn/',
'http://www.sohu.com/',
'http://www.163.com/'
);
//1、初始化一个批处理handle
$mh = curl_multi_init();

//2、往批处理handle 添加curl_init来的子handle
foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_HEADER, 0);
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $conn[$i]);
}

//3、并发执行,直到全部结束。
do {
curl_multi_exec($mh, $active);
} while ($active);

//4、获取结果
foreach ($urls as $i => $url) {
$data = curl_multi_getcontent($conn[$i]);
echo ($data);
echo '<hr />';
}

//5、移除子handle,并close子handle
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}

//6、关闭批处理handle
curl_multi_close($mh);

https://979137.com/archives/133.html