96

次のコマンドを使用して、Wgetを使用してcron経由でPHPスクリプトを実行しています。

wget -O - -q -t 1 http://www.example.com/cron/run

スクリプトの処理には、最大5〜6分かかります。WGetはそれを待って、必要なときにすべてを提供しますか、それともタイムアウトしますか?

4

5 に答える 5

161

wgetのマニュアルページによると、タイムアウトに関連するいくつかのオプションがあり、デフォルトの読み取りタイムアウトは900秒です。したがって、そうです、タイムアウトになる可能性があります。


問題のオプションは次のとおりです。

-T seconds
--timeout=seconds

ネットワークタイムアウトを秒秒に設定します。これは、、、およびをすべて同時に指定すること--dns-timeout--connect-timeout同じ --read-timeoutです。


そして、これらの3つのオプションについて:

--dns-timeout=seconds

DNSルックアップタイムアウトを秒秒に設定します。
指定された時間内に完了しないDNSルックアップは失敗します。
デフォルトでは、システムライブラリによって実装される場合を除いて、DNSルックアップにタイムアウトはありません。

--connect-timeout=seconds

接続タイムアウトを秒秒に設定します。
確立に時間がかかるTCP接続は中止されます。
デフォルトでは、システムライブラリによって実装される場合を除いて、接続タイムアウトはありません。

--read-timeout=seconds

読み取り(および書き込み)タイムアウトを秒秒に設定します。
このタイムアウトの「時間」とは、アイドル時間を指します。ダウンロードのいずれかの時点で、指定された秒数を超えてデータが受信されない場合、読み取りは失敗し、ダウンロードが再開されます。
このオプションは、ダウンロード全体の期間に直接影響しません。


私は次のようなものを使用していると思います

wget -O - -q -t 1 --timeout=600 http://www.example.com/cron/run

スクリプトの期間より長くなる前にタイムアウトがないことを確認する必要があります。

(ええ、それはおそらく可能な限り最も残忍な解決策です^^)

于 2010-02-18T19:26:12.630 に答える
39

デフォルトのタイムアウトは900秒です。別のタイムアウトを指定できます。

-T seconds
--timeout=seconds

デフォルトでは、20回再試行します。さまざまな試行を指定できます。

-t number
--tries=number

リンク:wgetmanドキュメント

于 2010-02-18T19:26:11.760 に答える
8

バージョン1.14より前では、バグのためにhttps経由でダウンロードする場合、wgetタイムアウト引数は順守されませんでした。

于 2014-08-14T06:54:28.713 に答える
7

あなたの質問でそれはPHPスクリプトだと言ったので、おそらく最良の解決策は単にスクリプトを追加することかもしれません:

ignore_user_abort(TRUE);

このようにして、wget終了しても、PHPスクリプトは、少なくとも制限を超えなくなるまで処理され続けますmax_execution_time(iniディレクティブ:デフォルトでは30秒)。

wgetとにかく、タイムアウトを変更しないでください。UNIXのマニュアルによるとデフォルトのwgetタイムアウトは900秒(15分)で、whisは必要な5〜6分よりはるかに長くなります。

于 2012-12-19T15:57:46.470 に答える
2

wgetのタイムアウト値は、ファイルのダウンロードにかかる時間とは関係ありません。

トリガーしているPHPスクリプトが5分間アイドル状態にあり、データを返さない場合--read-timeout、スクリプトの実行にかかる時間よりも短く設定されていると、wgetがトリガーされます。

実際にファイルをダウンロードしている場合、またはPHPスクリプトが...進行状況インジケーターなどのデータを送り返す場合、スクリプトが何かを実行している限り、読み取りタイムアウトはトリガーされません。

wget --helpあなたに言う:

  -T,  --timeout=SECONDS           set all timeout values to SECONDS
       --dns-timeout=SECS          set the DNS lookup timeout to SECS
       --connect-timeout=SECS      set the connect timeout to SECS
       --read-timeout=SECS         set the read timeout to SECS

したがって、これを使用する--timeout=10と、DNSルックアップ、接続、およびバイトの読み取りのタイムアウトが10秒に設定されます。

ファイルをダウンロードするときは、タイムアウト値をかなり低く設定できます。接続しているサイトへの接続が良好である限り、10秒のタイムアウトで5分で大きなファイルをダウンロードできます。サイトまたはDNSへの一時的な接続障害が発生した場合、転送は10秒後にタイムアウトになり、再試行します(--tries別名-t> 1の場合)。

たとえば、ここでは、ダウンロードに4分かかるNVIDIAからファイルをダウンロードしており、wgetのタイムアウト値を10秒に設定しています。

$ time wget --timeout=10 --tries=1 https://developer.download.nvidia.com/compute/cuda/11.2.2/local_installers/cuda_11.2.2_460.32.03_linux.run
--2021-07-02 16:39:21--  https://developer.download.nvidia.com/compute/cuda/11.2.2/local_installers/cuda_11.2.2_460.32.03_linux.run
Resolving developer.download.nvidia.com (developer.download.nvidia.com)... 152.195.19.142
Connecting to developer.download.nvidia.com (developer.download.nvidia.com)|152.195.19.142|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3057439068 (2.8G) [application/octet-stream]
Saving to: ‘cuda_11.2.2_460.32.03_linux.run.1’

cuda_11.2.2_460.32.03_linux.run.1        100%[==================================================================================>]   2.85G  12.5MB/s    in 4m 0s

2021-07-02 16:43:21 (12.1 MB/s) - ‘cuda_11.2.2_460.32.03_linux.run.1’ saved [3057439068/3057439068]


real    4m0.202s
user    0m5.180s
sys 0m16.253s

ダウンロードまで4分、タイムアウトは10秒で、すべてが正常に機能します。

一般に、DNS、接続、および読み取りを低い値を使用してタイムアウトにすることをお勧めします。デフォルト値の900sのままにしておくと、DNSまたはインターネット接続に問題が発生するたびに15m待機することになります。

于 2021-07-02T23:50:43.900 に答える