当前位置: 代码迷 >> 综合 >> M3U8 并发下载视频神器,让大家协程的威力有多大
  详细解决方案

M3U8 并发下载视频神器,让大家协程的威力有多大

热度:25   发布时间:2024-02-26 15:15:35.0

产生背景:最近身边有位同志说:“你了解M3U8文件???,你能用实现一个下载片儿的神器???”。好家伙!一下就提了两个问题此时我就逐个回答。我还不知道M3U8是什么呢,我通过网络知道这是挺流行的网络视频格式。然后那位同志给了我一个网站,我通过“浏览器-》控制台”发现M3U8居然是个文件,然后下面请求出现了很多.ts结尾的视频片段;此时你说用迅雷下载那肯定不现实,然后我就想到用“世界上最好的语言PHP”来做这个事情。然后开始下面这个项目,我已经测试多个网站均无大问题。

产生问题:一个500MB的视频文件,可能拆分出上2000多个视频片段(.ts)那么通过传统同步IO请求方式,肯定效率可想而知;尤其是国外的视频网站,自己网络不好国外服务器不稳定等等因素会导致500MB的分片下载完成,可能需要10分钟以上!!!后来想到这种异步IO,可以采用Swoole 提供的Coroutine来做。

传统同步单进程IO下载速度如下:

任务描述:视频片段1089个文件,大小420MB+,单进程

环境:Swoole:4.5.4, PHP: v7.3.20, Os: Linux, Downloader: v1.0。

结果:单进程同步IO用时6.25分钟,当然这是国内环境,国内服务器稳定的情况。(网站未做并发限制

协程异步IO下载速度如下:

任务描述:视频片段1089个文件,大小420MB+8 进程(8核CPU)90个协程

结果:

测试结果1:多核90个协程用时1.1分钟,当然这是国内环境,国内服务器稳定的情况。

测试结果2:多核心40个协程,用时53秒(注意:协程越多不代表越快,对方服务器未必能承受并发)

测试结果3:多核心200个协程,用时1.23分钟

测试结果4:多核心1000个协程,我租房的宽带爆了,直接失败!!!

结论:

  1. 涉及到IO调度的情况,使用协程并发性能极高。提升效率很明显,但是请记住不是越多越好!!!
  2. 协程数量逐渐上升,下载时间反倒更加长甚至失败!!
  3. 直接总结,Swoole协程是利用多进程填满CPU。
  4. 相信通过上面这些,大家应该也知道协程的魅力了吧!!
  5. 提高网站相应速度,提高服务器并发性能。
  6. 项目已提交到Github,本人已经通过多次测试均无大问题,尽情下片儿!!!
  7. Github:        大家不要吝啬手中的小星星哦~ (这一点比上面都都重要!!!! *3