ホームページ > バックエンド開発 > PHPチュートリアル > PHP で中断せずに長時間のダウンロードを実現するにはどうすればよいですか?緊急!緊急!

PHP で中断せずに長時間のダウンロードを実現するにはどうすればよいですか?緊急!緊急!

WBOY
リリース: 2016-06-23 14:19:22
オリジナル
1145 人が閲覧しました

中断のない長期的な php のダウンロード

中断のない長期ループで Web サイトの API ファイルをダウンロードするための php の方法を探しています
または、毎日同じタスクをダウンロードしてそれを実行できるソフトウェアを探しています使用するスケジュールされたタスク
主にAPIファイルをダウンロードするために使用されます
現在、phpのコピー機能を使用してダウンロードしていますが、1時間以上経過してもダウンロードできません。なぜ設定する必要があるのか​​わかりません。他に何かありますか? ? ?
神に助けを求めてください~~~~~

ディスカッション(解決策)に返信

まず、100,000 個のデータをキャプチャしたい場合は、一度にすべてをキャプチャしないことをお勧めします

1,000 個のアイテムをキャプチャし、実行時間を確認します。それが 1 分の場合、コマンド (Linux) を作成するか、3 分ごとに実行するタスク (Windows) をスケジュールできます

一度に 100,000 個のアイテムが実行される場合、間違いなく問題が発生します

<?phpheader("content-type:text/html;charset=utf-8");set_time_limit(0);$curl = curl_init();$target_file = 'ftp://IP:端口/'.date("Ymd",time()).'.sql';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 = 'D:/backup/';if(is_dir($target_path)){	$outfile = fopen($target_path.'/'.date("Ymd",time()).'.sql',"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);}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
は、CURL アプレットを学習していたときに、データベースをバックアップするダウンロード サーバーを作成しました。スケジュールされたタスクを追加し、このページにアクセスしてダウンロードします。

まず、100,000 個のデータをキャプチャする場合は、一度にすべてをキャプチャしないことをお勧めします

1,000 個キャプチャして実行時間を確認します 1 分であれば、コマンドを書くことができます。 (linux) またはタスクをスケジュールする (windows) 3 分ごとに 1 回実行されます

一度に 100,000 個のアイテムが実行されると、間違いなく問題が発生します

こんにちは、ご回答ありがとうございます
説明してください、ダウンロードされた 1 つのファイルファイルサイズはそれほど大きくなく、数メガバイトから 30 メガバイトの間だけです
主な理由は、ファイルサイズが 600 を超えており、長時間のダウンロードプロセスが中断される原因でした
以前は、ダウンロード記録を保存して判断するためのデータベースが構築されていました、複数回の実行で完了しました
一度で完了する方法はありますか
もしくは、そんな機能が実現できるソフトはありますか


まず、10万件のデータを取り込みたい場合は、一度にすべてをキャプチャしないことをお勧めします

1,000 個をキャプチャし、実行時間を確認します。1 分であれば、コマンド (Linux) または計画を作成できます。タスク (Windows) は 3 分ごとに実行されます。

一度に 100,000 個のアイテムが実行されると、間違いなく問題が発生します

こんにちは、ご回答ありがとうございます
説明してください、ダウンロードされた 1 つのファイルはそれほど大きくなく、わずか数メガバイトから 30 メガバイトです
主な理由ファイルが600個以上あるため、ダウンロード処理が長時間中断されてしまいます
以前は判定用にダウンロード記録を保存するデータベースを作成していましたが、複数回の実行で完了してしまいました
何か方法はありますか?実行は一度に完了しました
それとも、そのような機能を実現できるソフトウェアはありますか


申し訳ありませんが、そのようなソフトウェアは聞いたことがありません... 私のようなプログラマーの多くは、複雑な要件に直面した場合、独自のコードを作成することを好みます。 . 実行...

データベースを使用して、一定の数をダウンロードするたびに、記録されていないものからダウンロードを続けるだけで良いのではないでしょうか。ポイントしてから、スケジュールされたタスクまたは wget を実行します

set_time_limit(0); が必要かもしれません。

<?phpheader("content-type:text/html;charset=utf-8");set_time_limit(0);$curl = curl_init();$target_file = 'ftp://IP:端口/'.date("Ymd",time()).'.sql';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 = 'D:/backup/';if(is_dir($target_path)){	$outfile = fopen($target_path.'/'.date("Ymd",time()).'.sql',"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);}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
は、CURL を学習していたときに、ダウンロード サーバー上のデータベースをバックアップする小さなプログラムを作成しました。スケジュールされたタスクを追加し、このページにアクセスしてダウンロードします。
こんにちは、ご回答ありがとうございます
FTP を使用せずに他の人のサーバーに API ファイルをダウンロードしました
あなたのプログラムで試してみましたが、ダウンロードできないようです。間違っているのかわかりません。間違っています、確認するのを手伝ってもらえませんか
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 時間以上実行してもプログラムが中断します。他に設定する必要があるものはありますか?


<?phpheader("content-type:text/html;charset=utf-8");set_time_limit(0);$curl = curl_init();$target_file = 'ftp://IP:端口/'.date("Ymd",time()).'.sql';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 = 'D:/backup/';if(is_dir($target_path)){	$outfile = fopen($target_path.'/'.date("Ymd",time()).'.sql',"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);}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
が CURL を学習していたときに作成した、サーバー上のデータベースをダウンロードしてバックアップする小さなプログラム。スケジュールされたタスクを追加し、このページにアクセスしてダウンロードします。
こんにちは、ご回答ありがとうございます
FTP を使用せずに他の人のサーバーに API ファイルをダウンロードしました
あなたのプログラムで試してみましたが、ダウンロードできないようです。間違っているのかわかりません。間違っています。確認するのを手伝ってください
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) を使用して、すべてのファイルの実行時間を無制限に設定してください。 6G以上。


おそらく set_time_limit(0); が必要ですか?
こんにちは。これでうまくいきましたが、1 時間以上実行してもプログラムが中断します。他に設定する必要があるものはありますか?

私は個人的には...それは普通だと思います... PHP は確かに長期プログラムの処理に優れていますか? もちろん、これは個人的な意見であることを強調しておく必要がありますが、理論的には、過酷な環境でもスムーズに実行できます。 ? (安定したネットワーク環境 + 十分なメモリ

別々に取得しましょう...


您好,因为下载完成后,还需要导入到数据库,但是我不知道什么时候才下载完,这个要用什么方式来做判断比较好呢?
还有一点,目前是在计划任务里面,添加批处理的方式打开程序,然后执行10秒后自动关闭掉进程,但是程序还是有执行下载1个多小时后才中断,这样对服务器会有什么影响吗?



<?phpheader("content-type:text/html;charset=utf-8");set_time_limit(0);$curl = curl_init();$target_file = 'ftp://IP:端口/'.date("Ymd",time()).'.sql';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 = 'D:/backup/';if(is_dir($target_path)){	$outfile = fopen($target_path.'/'.date("Ymd",time()).'.sql',"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);}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
学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文件。双击执行即可,也可以加入到计划任务中,每天执行。

<?phpheader("content-type:text/html;charset=utf-8");set_time_limit(0);$curl = curl_init();$target_file = 'ftp://IP:端口/'.date("Ymd",time()).'.sql';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 = 'D:/backup/';if(is_dir($target_path)){	$outfile = fopen($target_path.'/'.date("Ymd",time()).'.sql',"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);}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
学CURL的时候写的一个下载服务器上备份数据库的小程序。添加个计划任务访问这个页面实现下载。 此法可解

这种用shell来做不是更好啊

偶这边光纤也不敢保证很耗时的多文件下载能一次完成,我总是多次执行跳过已完成的确保全部下载完成
wget 或其他命令行客户端有检测跳过(或续传,续传一般建立在字节数固定的情况)的功能

如果想自动化,建议用log,记录仪下载完成的或出错的
循环N次,跳过完成的,重新下载出错的,直到log内记录全部都完成
或者log只记录出错的,循环下载直到log记录为0

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート