1. 程式人生 > >PHP如何異步福彩3D平臺出租斷點續傳大文件

PHP如何異步福彩3D平臺出租斷點續傳大文件

狀態 啟動 理發 題解 都是 下一步 我們 .com www.

福彩3D平臺出租 haozbbs.com Q1446595067
最近業務中碰到一個問題,就是需要用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平臺出租斷點續傳大文件