応答を得るWget 403


0

1時間でリクエストの制限があるAPIを使用しています。しかし、私のスクリプトは一度にすべてを行うため、403を取得するため、リクエストの約1/3を失います。

wgetの応答を確認する方法はありますか?403を取得して5分待って再試行する場合は?

そして、ここに私の(今のところ)テストコードがあります:

system ("wget \"http://test-link.com/403/\" -O  {$dir}/{$in_dir_counter}.xml");
$test = system ("wget \"http://test-link.com/403/\" -O  {$dir}/{$in_dir_counter}.xml");

echo "responsed - ".$test;      

両方が同じを返します。


あなた自身の研究は何を示唆していますか?
デイブ

私の研究?私が読んだすべてのフォーラムは、すべてのリクエストにタイムアウトを追加することを提案しています。しかし、このような条件(403)を完了するには1〜2日かかるため、私はできません。したがって、10秒程度のタイムアウトを追加すると、少なくとも4〜5日間は幸いです。
user270181

あなたは、スクリプトまたはその関連部分掲示場合は、参考になる
TOG

コードの一部を追加しました。それが役に立てば幸い。
user270181

回答:


0

そのための簡単なスクリプトを使用してはどうですか:

  • 既に実行されていない限り、5分ごとにスクリプトを実行します。
  • ローカルファイルの経過時間を確認してください。特定のしきい値よりも古い場合は、再度ダウンロードします。

そのため、すべてがスムーズに進んだとしても、ファイルが古くなっていなければ何も起こりません。ファイルが古く、ダウンロードに失敗した場合は、次の反復を再試行できます。

なぜこれをタグ付けしたのかphpわかりませんが、実際にPHPスクリプトを実行している場合、このアプローチはかなり簡単です(Webソケットが有効になっている場合):

foreach($files as $file)
    if (@filemdate($local_path + $file) + $cache_duration < time())
        @copy($remote_path + $file, local_path + $file);

$remote_path確かにHTTPまたはFTP URLであることに注意してください。wgetを呼び出す必要はありません。これ@により、エラーメッセージが出力されなくなります。

これが不必要な待機を引き起こさないことを証明するには:

  • ダウンロードするファイルが1000個あると仮定しますが、1時間あたり最大250個のファイルしかダウンロードできません。
  • cache_duration24時間(24 * 60 * 60)など、すべてのファイルを取得できる保存時間に設定します。
  • 上記のスクリプトを1時間に1回再実行します。
  • 最初の反復では、最初の250ファイルが更新されます。他は失敗します。
  • 2回目の反復では、最初の250ファイルがスキップされ(十分に新しいため)、次の250ファイルがダウンロードされます。
  • 4回目の反復の後、1000個すべてのファイルが更新/ダウンロードされます。
  • もちろん、5分などの短い間隔を設定できますが、これにより、より多くのリクエスト/トラフィックが作成されます(これが受け入れられるかどうかによって異なります)。

代替スクリプトのアイデア:

  • ファイルをダウンロードしてみてください。
  • 失敗した場合は、wgetの戻り値/終了コードに基づいて判断できます。その場合、5分間待ってから繰り返します。

私がコメントで言ったように-それはすでに1-2日かかります。5分のタイムアウトを追加するか、別のタイムアウトを開始すると、助けにはなりませんが、悪化させます。最小限の時間の無駄ですべてのリクエストを取得する必要があります。
user270181

私の最初のアプローチはタイムアウトを使用しません。すべての古いファイルを一度にダウンロードしようとします。5分後に再試行し、最初の試行に失敗したファイルのみをダウンロードします。すべてをダウンロードしようとする試みの間には、いくつかの待機があります。
マリオ

私が言ったように、すべてのスクリプトは1〜2日で機能します。それは彼らが私に与える情報の量に依存します。時には15k、時には45k。そして、さらに2つのスクリプトがあります。すべてが時系列で動作します。したがって、すべてのファイルをチェックして再試行する時間を無駄にすることはできません。私はその過程でそれをしなければなりません。
user270181

並列化してみてはどうですか?最後の試行を取得できる最新のファイルへのポインターまたはインデックスを保存することもできます。ここで少し創造的になってください。これにより、毎回すべてのファイルを再確認する必要がなくなります。すべてが完了したら、インデックスをリセットします。
マリオ

今、ファイルをチェックすることを考えています(情報を書き込む場所)。すべてのリクエストが新しいファイルを作成するためです。ファイルサイズが0(403)の場合、5秒間スリープしてから再試行してください。あれについてどう思う?
user270181
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.