下面就详细讲解一下 “PHP使用CURL_MULTI实现多线程采集的例子”:
介绍
CURL是一个网络请求库,它可以以各种协议发送请求并获取响应。PHP内置了CURL扩展,使用它可以轻松地实现网络请求。CURL_MULTI是CURL的多线程版本,可以并发处理多个CURL请求。
在本篇文章中,我们将介绍如何利用PHP中的CURL_MULTI实现多线程采集。
步骤
1.初始化CURL并设置选项
$curl = curl_multi_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
我们使用curl_mutli_init初始化CURL_MULTI,并设置一些选项,包括将响应返回给调用程序,以及允许CURL自动重定向。
2.添加多个请求到curl_multi
$urls = array(
'http://example.com/page1.html',
'http://example.com/page2.html',
'http://example.com/page3.html',
);
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_multi_add_handle($curl, $ch);
}
我们使用一个$urls数组,循环它并为每个URL创建一个CURL请求,设置类似的选项并将其添加到curl_multi。
3.运行curl_multi请求并读取响应
do {
curl_multi_exec($curl, $running);
curl_multi_select($curl);
} while ($running > 0);
foreach ($urls as $url) {
$ch = curl_init($url);
$response = curl_multi_getcontent($ch);
curl_multi_remove_handle($curl, $ch);
curl_close($ch);
// 处理响应
}
我们使用do-while循环运行curl_multi请求,直到所有请求完成。然后我们使用curl_multi_getcontent读取每个响应,并在处理后从curl_multi中删除CURL请求。
在这里,$response就是我们从每个URL获取的响应。
示例
下面是两个使用CURL_MULTI的示例。首先是获取所有百度站内搜索结果的例子:
$curl = curl_multi_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
$results = array();
$query = 'baidu.com';
for ($page = 1; $page <= 10; $page++) {
$url = "https://www.baidu.com/s?wd=site%3A{$query}&pn={$page}0";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_multi_add_handle($curl, $ch);
}
do {
curl_multi_exec($curl, $running);
curl_multi_select($curl);
} while ($running > 0);
for ($page = 1; $page <= 10; $page++) {
$url = "https://www.baidu.com/s?wd=site%3A{$query}&pn={$page}0";
$ch = curl_init($url);
$response = curl_multi_getcontent($ch);
curl_multi_remove_handle($curl, $ch);
curl_close($ch);
$doc = new DOMDocument();
$doc->loadHTML($response);
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//h3/a') as $node) {
$results[] = array(
'href' => $node->getAttribute('href'),
'title' => $node->nodeValue,
);
}
}
curl_multi_close($curl);
print_r($results);
此代码将获取百度站内搜索结果的前10页,并将结果存储在$results数组中。
接下来是一个使用CURL_MULTI将多个文件作为单个zip文件下载的示例:
$curl = curl_multi_init();
$files = array(
'http://example.com/file1.txt',
'http://example.com/file2.txt',
'http://example.com/file3.txt',
);
$zip = new ZipArchive();
$zip->open('files.zip', ZipArchive::CREATE);
foreach ($files as $file) {
$ch = curl_init($file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$temp = tmpfile();
curl_setopt($ch, CURLOPT_FILE, $temp);
curl_multi_add_handle($curl, $ch);
$handles[$file] = array(
'ch' => $ch,
'temp' => $temp,
);
}
do {
curl_multi_exec($curl, $running);
curl_multi_select($curl);
} while ($running > 0);
foreach ($files as $file) {
$handle = $handles[$file];
fclose($handle['temp']);
$zip->addFromString(basename($file), curl_multi_getcontent($handle['ch']));
curl_multi_remove_handle($curl, $handle['ch']);
curl_close($handle['ch']);
}
curl_multi_close($curl);
$zip->close();
此代码将多个文件下载并添加到单个zip文件中。
结论
这里介绍了如何采用CURL_MULTI实现的多线程采集,包括设置CURL请求选项、将请求添加到CURL_MULTI中以及获取响应和处理响应等步骤。我们还看了两个实际的例子来说明CURL_MULTI的功能和用途。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP使用CURL_MULTI实现多线程采集的例子 - Python技术站