PHP cURL 多线程访问网站:提高效率的最佳实践
PHP cURL 多线程访问网站:提高效率的最佳实践
在网页抓取、数据采集等场景中,我们需要频繁访问多个网站。使用单线程的 cURL 库进行访问会造成效率低下,而多线程编程可以显著提高访问速度。本文将介绍如何使用 PHP 的 cURL 库实现多线程访问网站,并提供代码示例和优化技巧。
传统单线程 cURL 访问网站
以下代码展示了使用单线程 cURL 访问 12 个网站的简单示例。
<?php
for($i=8888; $i<8900; $i++) {
$id = str_pad($i, 4, '0', STR_PAD_LEFT); // 将数字转化为4位字符串,前面补0
$url = 'http://39.134.24.161/dbiptv.sn.chinamobile.com/PLTV/88888890/224/322122'.$id.'/index.m3u8';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($response === false || $http_code >= 400) {
echo '访问失败:'.$url.'<br>';
} else {
echo '访问成功:'.$url.'<br>';
}
curl_close($ch);
}
?>
使用 cURL 多线程进行访问
cURL 多线程允许我们同时访问多个网站,提高效率。以下代码展示了使用 cURL 多线程访问 12 个网站的示例。
<?php
$mh = curl_multi_init(); // 初始化一个多curl句柄
$handles = array(); // 存储curl句柄
$results = array(); // 存储结果
for($i=8888; $i<8900; $i++) {
$id = str_pad($i, 4, '0', STR_PAD_LEFT); // 将数字转化为4位字符串,前面补0
$url = 'http://39.134.24.161/dbiptv.sn.chinamobile.com/PLTV/88888890/224/322122'.$id.'/index.m3u8';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_multi_add_handle($mh, $ch); // 将curl句柄添加到多curl句柄中
$handles[] = $ch; // 存储curl句柄
}
$active = null; // 当前活跃的curl句柄数
do {
$mrc = curl_multi_exec($mh, $active); // 执行多curl句柄
} while ($mrc == CURLM_CALL_MULTI_PERFORM); // 如果没有立即执行完成,则继续执行
while ($active && $mrc == CURLM_OK) { // 如果当前有活跃的curl句柄,并且执行没有错误
if (curl_multi_select($mh) == -1) { // 等待直到有活跃的curl句柄
usleep(100);
}
do {
$mrc = curl_multi_exec($mh, $active); // 执行多curl句柄
} while ($mrc == CURLM_CALL_MULTI_PERFORM); // 如果没有立即执行完成,则继续执行
}
foreach ($handles as $ch) {
$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); // 获取请求的url
$response = curl_multi_getcontent($ch); // 获取响应内容
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 获取http状态码
if($response === false || $http_code >= 400) {
$results[] = '访问失败:'.$url;
} else {
$results[] = '访问成功:'.$url;
}
curl_multi_remove_handle($mh, $ch); // 从多curl句柄中移除curl句柄
curl_close($ch); // 关闭curl句柄
}
curl_multi_close($mh); // 关闭多curl句柄
foreach ($results as $result) {
echo $result.'<br>';
}
?>
优化技巧
- 合理设置线程数: 根据服务器性能和网络状况调整线程数,避免过多的线程导致服务器负载过高。
- 设置超时时间: 设置合适的连接超时时间和响应超时时间,防止程序卡死在单个请求上。
- 使用代理: 使用代理服务器可以隐藏真实IP地址,并提高访问速度。
- 处理错误: 在代码中添加错误处理机制,避免程序因错误而崩溃。
总结
使用 PHP 的 cURL 库实现多线程访问网站可以显著提高访问效率。通过合理的配置和优化,我们可以更有效地进行网页抓取、数据采集等工作。
原文地址: https://www.cveoy.top/t/topic/oeXg 著作权归作者所有。请勿转载和采集!