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 库实现多线程访问网站可以显著提高访问效率。通过合理的配置和优化,我们可以更有效地进行网页抓取、数据采集等工作。

PHP cURL 多线程访问网站:提高效率的最佳实践

原文地址: https://www.cveoy.top/t/topic/oeXg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录