ホームページ > バックエンド開発 > PHPチュートリアル > curl は 115 個のリソースをダウンロードできますか?

curl は 115 個のリソースをダウンロードできますか?

WBOY
リリース: 2016-06-23 14:09:56
オリジナル
1159 人が閲覧しました

Thunder (115VIP ではありません) を使用して 300MB のリソースがダウンロードされました。元のスレッド 1 が設定されていますが、平均速度はわずか数 KB です。60% に達すると、エラーが表示されます。 URL アドレス パターンを分析した結果、URL 内の &t=1368261625 が変数であることがわかりました。この時間に基づいて 115 がダウンロード期限切れトランザクションを処理すると推定されます。

Ultraediter を使用して .td.cfg を開き、内部の &t=1368261625 を現在時刻に変更し、Thunder を再起動すると、ファイルが再ダウンロードされていることを確認します (前の 60% が消えています)。ダウンロード URL を変更した後、以前のダウンロードを続行できるように Thunder を変更する方法がわかりません。 (Xunlei にもファイルパラメータを比較するメソッドがあるはずですが、見つかりませんでした)

そこで、phpcurl を使用して 115 個のリソースをダウンロードすることを考えました (PHP は URL アドレスを任意に変更できます)。しかし、PHP のデフォルトのタイムアウトは 30 秒ですset_time_limit(0 ); の場合、リソース アドレス 115 の有効期限が切れたこと、つまり PHP ファイルが実行されたことをどのように判断するのでしょうか?
.bat ファイルを使用するか、コマンド プロンプト DOS から直接 php スクリプトを実行する予定です。

質問:
1.curl ブレークポイントを使用してファイルを保存すると、2 回目のダウンロード時に再び 0% から開始されますか?
2. 質問 1 が実現可能な場合、長時間の接続後に PHP ファイルが実行されたことを知るコードをどのように記述すればよいでしょうか? (ブレークポイントのダウンロードを実行するには、このように .bat または DOS を再実行します)

PS: インターネット上にアップロード コードは 115 個しかなく、ダウンロード コードはありません。可能であれば、オリジナル + エッセンスの投稿を手伝ってください。 、CSDN ブログにアクセスして入手できます。


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

他の内容は無視して、次のように質問してください:
コマンドラインを使用する予定であるのに、curl をロードするためになぜ PHP が必要なのでしょうか? curl.exeを直接使うことはできないのでしょうか?

私たちが識別できるように、最初にダウンロード アドレスを教えてください

私たちが識別できるように、最初にダウンロード アドレスを教えてください
ボス、U2 のアルバムのダウンロード アドレスを投稿してくれてありがとう
http://119.147 .99.31/gdown_group121/M00 /07/9C/d5NjH05TqRMAAAAF2WEJGZScDk3421731/2009_-_No_Line_On_The_Horizo​​n.rar?k=1zD-fJeIwQDpOh4kUbL9IA&t=1368286814&u=156279093 4-355643028-ckf4okro &s=51200&file=2009_-_No_Line_On_The_Horizo​​n.rar

&t=1368286814 のようです検証時間になります。情報。

アップロードを再開する原理について説明します。これについては自分で考えることができます

HTTP の再開には http リクエスト ヘッダー パラメーターが必要です
Range:bytes=aaaa-bbbb/cccc
応答ヘッダーにも Content- が必要です。長さ
aaaa は開始位置、bbbb は終了位置、cccc はファイルの長さ

マルチスレッドでは実際にファイルをスライスし、N 個のリクエストを送信し、それぞれの aaaa と bbbb が異なるセグメントを指してから結合します
転送再開手段の設定aaaa ハードディスクに書き込まれたファイルの場所でダウンロードを続行します
マルチスレッド + レジュームダウンロードでは、一般に各スライスの完了位置などを記録するレコードが必要です
したがって、レジュームダウンロードは次の 3 者を満足させる必要があります。クライアントは範囲、プロキシを送信できます。これは転送メカニズムではなく、接続メカニズムです。サーバーは範囲リクエストを受け入れることができます。

ダウンロードにツールを使用する場合、通常、ツールはレコード ファイルに対応する必要はありません。 URLとローカルファイル
URLが変更されると、ツールは以前の記録ファイルを「賢く」選択してダウンロードした部分を確認することが困難になります
逆に、マルチスレッドが機能しない場合は、さらに面倒になります事前に作成されたハードディスクの方法を使用してください

ソケットを自分で作成することで実行できるかもしれません

なお、/M00/07/ 9C/d5NjH05TqRMAAAAAF2WEJGZScDk3421731/ このようなパスは、基本的には一時的なパスであることが経験的に確認できます。サーバーがどのように処理するかを予測するのは困難です。削除するか、アクセスを禁止しますか?

curl にはブレークポイントの再開を完全に実現できる CURLOPT_RANGE 属性があります

しかし、昨夜はまだ戻ることができます
[0] => nginx
[Date] => Sat 、2013 年 5 月 11 日 15:23:43 GMT
[Content-Type] => application/octet-stream
[Content-Length] => 392528932
[Last-Modified] => 2011 年 8 月 23 日 13: 20:19 GMT
[接続] => 閉じる
[コンテンツの配置] => 添付ファイル
今日のみ戻ることができます
[0] =>
[サーバー] => nginx
[日付] => 2013 年 5 月 12 日 (日) 03:20:32 GMT
[コンテンツタイプ] => 492 3
[接続] => 閉じる

したがって、これはあきらめることができます
他のテスト可能な URL が見つかるまで待ちます

Curl にはブレークポイント再開を完全に実装できる CURLOPT_RANGE 属性があります
したがって、これはあきらめることができます

他のテスト可能な URL が見つかるまで待ちますテスト可能な URL テスト可能な URL は


日ごとに作成され、URL は数時間ごとに変更されます。何度も投稿するのは面倒です。

http://119.147.99.31/gdown_group121/M00/07/9C/d5NjH05TqRMAAAAF2WEJGZScDk3421731/2009_-_No_Line_On_The_Horizo​​n.rar?k=UlqeD7YQ3hi-tkpdRMXvvA&t=1 8352262&u=1562790755-355643028-ckf4okro&s=51200&file=2009_-_No_Line_On_The_Horizo​​n.rar

ボス、あなたの経験に基づいて、大まかな実行コードを書いてください。私はそれを自分でテストします、ありがとう。
テスト後、結果を再度投稿します。

あなたの URL は再開可能なダウンロードをサポートしていません。
勉強のためにテストコードを投稿しました。しかし、実用化するにはまだ多くの努力が必要です

$url = 'http://blog.51edm.org/content/uploadfile/201303/dc7f1364286796.zip';function curl_get($durl) {  $cookiejar = realpath('cookie.txt');  $t = parse_url($durl);  $ch = curl_init();  curl_setopt($ch, CURLOPT_URL,$durl);//  curl_setopt($ch, CURLOPT_HEADER, 1);  curl_setopt($ch, CURLOPT_RANGE, '0-300'); //从 0 偏移起取 301 的字节//  curl_setopt($ch, CURLOPT_NOBODY, 1);  curl_setopt($ch, CURLOPT_TIMEOUT,5);  curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);  curl_setopt($ch, CURLOPT_REFERER, "http://$t[host]/");  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);  curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'head_func');  curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function");  $r = curl_exec($ch);  curl_close($ch);  return $r;}echo '<xmp>';curl_get($url);//回调函数 $str 为读到的内容function progress_function($ch,$str) {//print_r(curl_getinfo($ch));    echo PHP_EOL, strlen($str);//,':',substr($str,0,20);    return strlen($str);}//回调函数,用于获得头信息function head_func($ch, $str) {echo $str;    return strlen($str);}
ログイン後にコピー

ヘッダー情報は次のようなものです

Content-Length: 301
Content-Range: bytes 0-300/1806285
この種のことは非常に便利です (サポートされていない場合)ブレークポイント再開、http://bbs.csdn.net/topics/390455233 などのようなものはありません)

あなたの URL はダウンロードの再開をサポートしていません。
勉強のためにテストコードを投稿しました。しかし、実用化するにはまだ努力が必要です

上司の指導のおかげで、基本原理を理解し、自分でプログラムを書くことができました。

すごいです

file_put_contents の FILE_APPEND を使用して、ブレークポイントを付けてファイルを保存します

あまり自信がないので、$range 値、つまり CURLOPT_RANGE ''.(($range-1)*1024*1024) を手動で変更します).'-'.($range*1024*1024-1).'、この計算は正しいですか?

コメントによると、
If $range=1, then 0-1048575 //0 オフセットから 1048576 のバイトを取得します
If $range=2, then 1048576-2097151 //1048576 オフセット 2097152 バイトから取得します

この場合、コメントに 1048576 が 2 つありますが、保存を繰り返すと最終的な rar ファイルが破損しますか?


さらに、 if(check_url_115($url)=='200') この判断は基本的に役に立ちません。ここにもひどい問題があります。つまり、CURLINFO_HTTP_CODE = 200 ですが、URL はダウンロードの途中で失敗し、次の CURLOPT_RANGE は 10M の倍数にはなりません。
解決策 1: 慎重に、$range が 10 回変更されるたびに URL アドレスを手動で更新します。
オプション 2: 10M に制限せず、PHP の filesize() を使用し、URL の有効期限が切れた後にハードディスクに保存されている rar サイズを読み取り、CURLOPT_RANGE を手動で設定しますが、filesize( ) 再起動時の CURLOPT_RANGE の値は本当に同じですか?この数値がバイト単位で正確である場合でも、少しでもずれがあると、rar 全体が破壊されます。


引き続きアドバイスをお待ちしております、ありがとうございます。



snmr_com で前述したように、ファイルの場所を保存する必要があります
これは非常に重要です。

既存の関数を単純に使用しないでください。オフセットの計算は成功の前提条件です。
カバレッジは問題ではありません。位置ずれは大きな問題です

1 つは手動またはツールを使用してダウンロードでき、もう 1 つはプログラムを使用してダウンロードできます。 2 つのファイルの md5 を比較して、プログラムが正しいかどうかを確認してください



ああ、テストを続けてください...

一晩かけてテストしたコードは実行可能ですが、非常に手間がかかり、10 MB に分割して保存し、クロールごとに間違いを恐れて個別にバックアップしました。重要なのは、これです。はカールマルチをサポートしていません。サポートできる場合は、Thunder That's it 115 ビューをダウンロードしましたが、携帯電話以外の登録はサポートされていないというメッセージが表示されました。
U2 のアルバムだけで 2 日かかりました...

要約: PHP は依然として 60 秒以内に実行できるサーバーサイドの処理です。115 件のダウンロードなどは依然として C でコンパイルされたソフトウェアに引き継がれる必要があります。それは正しい方法です。

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