如何使用curl进行网络测速?解决调用fast.com返回0无法加载的问题
如何用Curl获取fast.com的网络测速结果
直接请求http://fast.com返回0主要有两个原因:一是fast.com默认强制HTTPS,未处理重定向会导致请求失败;二是它的测速逻辑完全依赖前端JavaScript动态加载节点并计算速度,静态HTML本身不包含测速数据。以下是具体解决步骤:
第一步:修复Curl请求失败问题
先确保能正常发起请求(获取静态页面),需要添加浏览器UA、开启重定向、处理HTTPS:
$url = 'https://fast.com'; $curl = curl_init($url); // 模拟浏览器UA,避免被拦截 curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); // 跟随HTTPS重定向 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // 返回响应内容而非直接输出 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 设置请求超时 curl_setopt($curl, CURLOPT_TIMEOUT, 15); // 临时禁用SSL验证(生产环境建议配置CA证书) curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($response === false) { echo "Curl错误: " . curl_error($curl); } else { echo "请求成功,HTTP状态码: " . $httpCode; } curl_close($curl);
第二步:获取真实测速结果
fast.com通过内部API提供测速节点,下载节点文件即可计算速度:
1. 获取测速节点列表
请求官方API提取可用CDN节点:
$apiUrl = 'https://api.fast.com/netflix/speedtest?https=true&token=YXNkZmFzZGxmbnNkYWZoYXNkZmhrYWxm'; $curl = curl_init($apiUrl); curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $nodeData = curl_exec($curl); curl_close($curl); if (!$nodeData) { die("无法获取测速节点"); } $nodes = json_decode($nodeData, true); $targetUrls = array_column($nodes['targets'], 'url');
2. 执行测速计算
选择节点下载指定大小文件,计算下载速度:
// 取第一个节点测速(可循环多节点取平均值) $targetUrl = $targetUrls[0]; $startTime = microtime(true); $curl = curl_init($targetUrl); curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 限制最大下载量为10MB,避免下载完整大文件 curl_setopt($curl, CURLOPT_MAXFILESIZE, 10 * 1024 * 1024); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_exec($curl); $endTime = microtime(true); $downloadedBytes = curl_getinfo($curl, CURLINFO_SIZE_DOWNLOAD); curl_close($curl); // 计算速度并转换为Mbps $duration = $endTime - $startTime; if ($duration > 0) { $speedMbps = ($downloadedBytes / $duration) / (1024 * 1024) * 8; echo "测速结果: " . round($speedMbps, 2) . " Mbps"; } else { echo "测速失败,耗时过短"; }
注意事项
- fast.com的API Token可能会更新,若请求失败需从主页JavaScript中提取最新Token
- 多节点循环测速取平均值,结果会更准确
- 生产环境请配置合法SSL证书,不要长期禁用
CURLOPT_SSL_VERIFYPEER - 避免短时间内频繁请求节点,防止被CDN限制
内容的提问来源于stack exchange,提问作者merve demirel
相关产品推荐
相关产品推荐

