产生背景:最近身边有位同志说:“你了解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个协程,我租房的宽带爆了,直接失败!!!
结论:
- 涉及到IO调度的情况,使用协程并发性能极高。提升效率很明显,但是请记住不是越多越好!!!
- 协程数量逐渐上升,下载时间反倒更加长甚至失败!!
- 直接总结,Swoole协程是利用多进程填满CPU。
- 相信通过上面这些,大家应该也知道协程的魅力了吧!!
- 提高网站相应速度,提高服务器并发性能。
- 项目已提交到Github,本人已经通过多次测试均无大问题,尽情下片儿!!!
- Github: 大家不要吝啬手中的小星星哦~ (这一点比上面都都重要!!!! *3 )