1. 程式人生 > 實用技巧 >M3U8 併發下載視訊神器,讓大家協程的威力有多大

M3U8 併發下載視訊神器,讓大家協程的威力有多大

產生背景:

最近身邊有位同志說:“你瞭解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. Githubhttps://github.com/twomiao/Downloader-M3U8.git
  8. 第7點比前面所有重要!!!大家不要吝嗇手中的小星星哦~