php長時間下載不中斷
求一個php長時間迴圈下載網站api檔案不中斷的方法
或者求一個可以每天下載相同任務的軟體,然後放在計劃任務裡面可用的
主要用來下載api檔案
目前我是用php的copy函數下載,下1個多小時後就下載不了了,不知道什麼原因,是不是還要設定什麼東東啊???
求大神幫忙~~~~~
回複討論(解決方案)
首先,如果你要抓10W條資料 建議你不要一次全抓
抓1000條,看看執行時間,如果是1分鐘,你可以寫一條命令(linux)或者計劃任務(windows)每隔3分鐘執行一次
如果一次執行就10W條 那肯定容易出問題
學CURL的時候寫的一個下載伺服器上備份資料庫的小程式。添加個計劃任務訪問這個頁面實現下載。 首先,如果你要抓10W條資料 建議你不要一次全抓
抓1000條,看看執行時間,如果是1分鐘,你可以寫一條命令(linux)或者計劃任務(windows)每隔3分鐘執行一次
如果一次執行就10W條 那肯定容易出問題
您好,謝謝您的解答
說明下,下載的單個檔案不是很大,只有幾兆-30兆之間
主要是檔案有600多個,導致長時間下載程式中斷了
之前是有做個資料庫來儲存下載記錄用於判斷,但是是分多次執行完成的
有沒有什麼方法,可以一次性執行完成
或者有什麼軟體可以實現這樣的功能
首先,如果你要抓10W條資料 建議你不要一次全抓
抓1000條,看看執行時間,如果是1分鐘,你可以寫一條命令(linux)或者計劃任務(windows)每隔3分鐘執行一次
如果一次執行就10W條 那肯定容易出問題
您好,謝謝您的解答
說明下,下載的單個檔案不是很大,只有幾兆-30兆之間
主要是檔案有600多個,導致長時間下載程式中斷了
之前是有做個資料庫來儲存下載記錄用於判斷,但是是分多次執行完成的
有沒有什麼方法,可以一次性執行完成
或者有什麼軟體可以實現這樣的功能
很抱歉我還沒聽說過有這樣的軟體... 很多碼農和我一樣在面對複雜需求的死後喜歡自己寫個代碼來跑....
就用你的方法不是挺好麼 用資料庫儲存下下載記錄,每次下載固定個數,下次執行時從未記錄處開始繼續下載,然後跑計劃任務或者wget即可
也許你需要 set_time_limit(0);?
學CURL的時候寫的一個下載伺服器上備份資料庫的小程式。添加個計劃任務訪問這個頁面實現下載。
您好,謝謝您的解答
我下載的是別人伺服器上的api檔案沒ftp
剛用您的程式試了下,好像不能下載,不知道是不是我改的有錯,您幫忙看下
header("content-type:text/html;charset=utf-8");set_time_limit(0);$curl = curl_init();$target_file = 'http://www.meituan.com/api/v2/changle/deals';//這樣的檔案有600多個curl_setopt($curl,CURLOPT_URL,$target_file);curl_setopt($curl, CURL_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_VERBOSE, 1);curl_setopt($curl, CURLOPT_FTP_USE_EPSV, 0);curl_setopt($curl,CURLOPT_TIMEOUT,300);curl_setopt($curl, CURLOPT_USERPWD, "update:windcms");$target_path = '';if(is_dir($target_path)){$outfile = fopen($target_path.'/'.date("Ymd",time()).'.xml',"w+");curl_setopt($curl,CURLOPT_FILE,$outfile);$info = curl_exec($curl);fclose($outfile);$error_no = curl_errno($curl);if($error_no === 0){echo "下載成功!";}else{echo "下載失敗!";}curl_close($curl);} 也許你需要 set_time_limit(0);?
您好,這個我有用,但還是運行到1個多小時程式就斷了,請問下還需要設定什麼嗎?
學CURL的時候寫的一個下載伺服器上備份資料庫的小程式。添加個計劃任務訪問這個頁面實現下載。
您好,謝謝您的解答
我下載的是別人伺服器上的api檔案沒ftp
剛用您的程式試了下,好像不能下載,不知道是不是我改的有錯,您幫忙看下
header("content-type:text/html;charset=utf-8");set_time_limit(0);$curl = curl_init();$target_file = 'http://www.meituan.com/api/v2/changle/deals';//這樣的檔案有600多個curl_setopt($curl,CURLOPT_URL,$target_file);curl_setopt($curl, CURL_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_VERBOSE, 1);curl_setopt($curl, CURLOPT_FTP_USE_EPSV, 0);curl_setopt($curl,CURLOPT_TIMEOUT,300);curl_setopt($curl, CURLOPT_USERPWD, "update:windcms");$target_path = '';if(is_dir($target_path)){$outfile = fopen($target_path.'/'.date("Ymd",time()).'.xml',"w+");curl_setopt($curl,CURLOPT_FILE,$outfile);$info = curl_exec($curl);fclose($outfile);$error_no = curl_errno($curl);if($error_no === 0){echo "下載成功!";}else{echo "下載失敗!";}curl_close($curl);} 用readdir遍曆下目錄,迴圈執行下載就行了,反正用set_time_limit(0);設定了指令碼執行時間無限制,你所有檔案估計有6G以上吧。
也許你需要 set_time_limit(0);?
您好,這個我有用,但還是運行到1個多小時程式就斷了,請問下還需要設定什麼嗎?
我個人表示...很正常... PHP在處理長時間的程式上確實比較?,當然,必須強調的是這是個人看法,理論上在嚴苛的環境下能夠順利執行?(穩定的網路環境+足夠巨大的記憶體
還是分開抓吧...
您好,因為下載完成後,還需要匯入到資料庫,但是我不知道什麼時候才下載完,這個要用什麼方式來做判斷比較好呢?
還有一點,目前是在計劃任務裡面,添加批處理的方式開啟程式,然後執行10秒後自動關閉掉進程,但是程式還是有執行下載1個多小時後才中斷,這樣對伺服器會有什麼影響嗎?
學CURL的時候寫的一個下載伺服器上備份資料庫的小程式。添加個計劃任務訪問這個頁面實現下載。
您好,謝謝您的解答
我下載的是別人伺服器上的api檔案沒ftp
剛用您的程式試了下,好像不能下載,不知道是不是我改的有錯,您幫忙看下
header("content-type:text/html;charset=utf-8");set_time_limit(0);$curl = curl_init();$target_file = 'http://www.meituan.com/api/v2/changle/deals';//這樣的檔案有600多個curl_setopt($curl,CURLOPT_URL,$target_file);curl_setopt($curl, CURL_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_VERBOSE, 1);curl_setopt($curl, CURLOPT_FTP_USE_EPSV, 0);curl_setopt($curl,CURLOPT_TIMEOUT,300);curl_setopt($curl, CURLOPT_USERPWD, "update:windcms");$target_path = '';if(is_dir($target_path)){$outfile = fopen($target_path.'/'.date("Ymd",time()).'.xml',"w+");curl_setopt($curl,CURLOPT_FILE,$outfile);$info = curl_exec($curl);fclose($outfile);$error_no = curl_errno($curl);if($error_no === 0){echo "下載成功!";}else{echo "下載失敗!";}curl_close($curl);} 用readdir遍曆下目錄,迴圈執行下載就行了,反正用set_time_limit(0);設定了指令碼執行時間無限制,你所有檔案估計有6G以上吧。
嗯,是的,差不多有5G左右
您好,因為下載完成後,還需要匯入到資料庫,但是我不知道什麼時候才下載完,這個要用什麼方式來做判斷比較好呢?
還有一點,目前是在計劃任務裡面,添加批處理的方式開啟程式,然後執行10秒後自動關閉掉進程,但是程式還是有執行下載1個多小時後才中斷,這樣對伺服器會有什麼影響嗎?
這類問題不是具體的某個語句的問題,所以我只能說我的思路無法保證這樣就一定能行或者是最好的
你可以copy之前和copy完完之後再資料庫寫兩個開始/結束標誌
在php檔案copy之前檢查上一個程式是否執行完畢,如果沒有就退出,如果有,就寫上開始標誌開始copy
這樣根本不存在執行一個多小時的問題吧...
您好,因為下載完成後,還需要匯入到資料庫,但是我不知道什麼時候才下載完,這個要用什麼方式來做判斷比較好呢?
還有一點,目前是在計劃任務裡面,添加批處理的方式開啟程式,然後執行10秒後自動關閉掉進程,但是程式還是有執行下載1個多小時後才中斷,這樣對伺服器會有什麼影響嗎?
這類問題不是具體的某個語句的問題,所以我只能說我的思路無法保證這樣就一定能行或者是最好的
你可以copy之前和copy完完之後再資料庫寫兩個開始/結束標誌
在php檔案copy之前檢查上一個程式是否執行完畢,如果沒有就退出,如果有,就寫上開始標誌開始copy
這樣根本不存在執行一個多小時的問題吧...
您好,執行一個小時是因為下載的檔案數量太多了,因為我是迴圈下載的,下載到哪裡停下,下次就從哪裡再下載
好吧,我不知道如何讓下載5G檔案的PHP程式穩定執行好幾個小時
剛才說的都是迴圈抓取的方案,如果要用一次抓取的,個人表示無法給出有效建議.
好吧,我不知道如何讓下載5G檔案的PHP程式穩定執行好幾個小時
剛才說的都是迴圈抓取的方案,如果要用一次抓取的,個人表示無法給出有效建議.
您好,如果用wget的話可以實現一次性抓取嗎?
因為我沒用過wget,所以請教下
wget有斷點續傳功能 不過我沒這樣用過 可參閱
http://xinkang120.blog.163.com/blog/static/194668223201188114417360/
PHP斷點下載,可以找相關外掛程式。
如果是windows伺服器,可以考慮cmd執行,這個是沒有逾時 時間,且不會掉線的。
上次用這個方法抓取了5000多個flash小遊戲檔案,掛在伺服器執行即可。
另外:如果想儘快下載的話,可以考慮不用PHP,使用PHP把抓取到得待採集檔案地址入庫,匯出成列表。匯入到迅雷或者其他下載軟體進行批量下載,話說這個方法也試過,還不錯
如果是windows伺服器,可以考慮cmd執行,這個是沒有逾時 時間,且不會掉線的。
上次用這個方法抓取了5000多個flash小遊戲檔案,掛在伺服器執行即可。
另外:如果想儘快下載的話,可以考慮不用PHP,使用PHP把抓取到得待採集檔案地址入庫,匯出成列表。匯入到迅雷或者其他下載軟體進行批量下載,話說這個方法也試過,還不錯
您好,謝謝您的解答
第一種方法是用cmd執行php檔案嗎?如果是的話,我試過用cmd來處理網頁也會逾時的啊,不知道是不是我的方法不對,如果不是的話要怎麼弄呢?
第二種用迅雷的話,要怎麼做才能夠每天都運行一次呢?因為我下載的連結是相同的,只是內容每天都有更新,但是迅雷下載完後好像不能重複下載,請教下這個要怎麼設定?
看樣子,你這種情況用迅雷是不行的,是一個計劃任務。迅雷貌似沒有提供什麼介面給程式用。
用cmd的話,就是執行PHP檔案,這裡面沒有逾時的,即使php.ini配置了逾時時間。比較簡單的方法就是把PHP加入到系統Path裡面(不曉得這個你會不會,不會的話google下),然後寫一個bat檔案就行了
php d:\wwwroot\cmd\task.phppause
這個task.php就是你用HTTP訪問網頁來執行任務的檔案。把這個儲存為.bat檔案。雙擊執行即可,也可以加入到計劃任務中,每天執行。
學CURL的時候寫的一個下載伺服器上備份資料庫的小程式。添加個計劃任務訪問這個頁面實現下載。 此法可解 這種用shell來做不是更好啊
偶這邊光纖也不敢保證很耗時的多檔案下載能一次完成,我總是多次執行跳過已完成的確保全部下載完成
wget 或其他命令列用戶端有檢測跳過(或續傳,續傳一般建立在位元組數固定的情況)的功能
如果想自動化,建議用log,記錄儀下載完成的或出錯的
迴圈N次,跳過完成的,重新下載出錯的,直到log內記錄全部都完成
或者log只記錄出錯的,迴圈下載直到log記錄為0