如何优化通过YouTube API获取播放列表视频时长的PHP脚本
优化YouTube播放列表视频时长批量查询的方法
嘿,我之前做类似功能的时候也踩过单条请求的坑,效率确实拉胯!给你几个亲测有效的优化思路,能大幅提升脚本速度:
1. 用YouTube Data API的批量查询功能(最核心优化)
YouTube的videos.list接口支持一次传入最多50个视频ID(用逗号分隔),这样能把原本N次的请求压缩成ceil(N/50)次,直接砍掉大部分HTTP请求的握手开销。比如你有200个视频,原来要200次请求,现在只要4次,速度提升非常明显。
举个PHP实现的简化示例:
function getBatchVideoDurations($videoIds, $apiKey) { $batchSize = 50; $durationMap = []; // 把视频ID数组分成每50个一组 $idBatches = array_chunk($videoIds, $batchSize); foreach ($idBatches as $batch) { $idsStr = implode(',', $batch); // 构造批量查询的API URL $apiUrl = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id={$idsStr}&key={$apiKey}"; // 实际项目建议用Guzzle或cURL替代file_get_contents,更稳定 $response = file_get_contents($apiUrl); $result = json_decode($response, true); foreach ($result['items'] as $videoItem) { $videoId = $videoItem['id']; // 提取ISO 8601格式的时长,可选转成秒数 $isoDuration = $videoItem['contentDetails']['duration']; $durationMap[$videoId] = convertIsoToSeconds($isoDuration); } } return $durationMap; } // 辅助函数:将ISO 8601时长(比如PT15M30S)转为秒数 function convertIsoToSeconds($isoDuration) { $interval = new DateInterval($isoDuration); return $interval->h * 3600 + $interval->i * 60 + $interval->s; }
2. 复用HTTP连接减少握手耗时
如果用cURL发送请求,记得开启持久连接,避免每次请求都重新建立TCP连接:
$ch = curl_init(); curl_setopt($ch, CURLOPT_FORBID_REUSE, false); // 允许复用连接 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 其他cURL配置...
如果用Guzzle这类HTTP客户端,默认就支持连接池,能自动复用连接,比原生cURL更省心。
3. 缓存已查询的视频时长
如果你的脚本会重复运行(比如定期更新播放列表时长),把已经查到的视频ID和时长缓存起来(比如存在MySQL、Redis或者本地JSON文件里)。下次运行时先查缓存,只对新增的视频ID发起API请求,完全避免重复请求相同数据。
4. 异步并行请求(适合超大量视频)
如果播放列表里有几百上千个视频,可以把请求拆分成多个异步任务并行处理:
- 用PHP的
pcntl扩展实现多进程,同时发送多个批量请求 - 或者把任务放到队列(比如Redis Queue)里,后台异步执行,不用等所有请求同步完成
注意事项
别忘了YouTube Data API有配额限制,批量查询虽然减少了请求次数,但每个视频还是会消耗1个单位的配额,总配额和单条请求是一样的,只是大幅降低了请求的网络开销。
内容的提问来源于stack exchange,提问作者Kokox
相关产品推荐
相关产品推荐

