PHP如何異步福彩3D平臺出租斷點續傳大文件
最近業務中碰到一個問題,就是需要用PHP去上傳一個大文件,大小差不多一個G,這可就為難我了,因為大文件上傳一直是個老大難的問題,不過最近騷操作一波還是可以愉快的實現的,下面簡單說下如何實現
關鍵字:wget,PHP後臺執行腳本
首先給大家介紹下wget命令,這個命令我之前都是用來下載用的,不過wget還有一個功能,就是可以斷點續傳,那一個大文件想要安全且穩定的上傳,斷電續傳的加入必不可少,為什麽選用wget,主要還是因為wget基本每臺機器都會裝,不需要做太多運維的工作,簡單看下命令
wget -c -t 10 -T 120 -O {$target} http://www.yzb.com/xuexi.mp4
其中$target是保存的路徑,後面 xuexi.mp4是需要上傳的文件,這個命令要發在最終要上傳到的機器上面執行
接下來講下命令含義
1、wget 中
-c 重新啟動下載中斷的文件,也就是斷點續傳
-t 鏈接到資源的超時時間,我是設定如果兩分鐘內還找不到資源就超時
-O 將下載下來的文件重命名
那斷點續傳的問題解決了,我們需要解決PHP代碼的問題,怎麽說呢,如果B機器是請求到A上的一個PHP腳本,然後PHP腳本執行wget命令,那麽就會有一個超時的問題,因為A在用wget下載B上的xuexi.mp4的時候,一定會很久,如果PHP腳本長時間無法回應B的請求的時候,就會報502超時,那這個怎麽辦呢
我們知道,一個外部請求到php,需要經過nginx代理發送到php-fpm上,然後php-fpm調用PHP解釋器編譯PHP代碼
那這樣的話,nginx這一層就會超時,那要怎麽不超時,異步上傳呢
首先先寫一個父腳本,這個父腳本只有一件事,直接調用php-fpm執行PHP上傳腳本
父腳本核心代碼
pclose(popen("/yzb/php/bin/php downloadFile.php 2>&1 &", "r"));
上面的代碼可以快速結束,而不像exec函數那樣要等裏面的命令執行完畢才能進行下一步,就解決請求超時的問題。大家可以看到,命令的最後加了個&符號,這個是告訴服務器,這是一條需要後臺執行的腳本,通過popen來執行,可以異步執行下載的腳本
downloadFile.php 核心代碼
exec("wget -c -t 10 -T 120 -O {$target} http://www.yzb.com/demo.php 2>&1", $output, $return_val);
記得加上 2>&1,這是告訴服務器這條命令的輸出是要保存在變量裏的,這樣$output才能獲取到執行後的結果
這樣downloadFile.php是直接通過php-fpm來執行,執行完之後改下這個文件的上傳狀態即可,這樣就完成一個簡單的異步斷點續傳的功能
PHP如何異步福彩3D平臺出租斷點續傳大文件