次のコマンドを使用して、Wgetを使用してcron経由でPHPスクリプトを実行しています。
wget -O - -q -t 1 http://www.example.com/cron/run
スクリプトの処理には、最大5〜6分かかります。WGetはそれを待って、必要なときにすべてを提供しますか、それともタイムアウトしますか?
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
スクリプトの期間より長くなる前にタイムアウトがないことを確認する必要があります。
(ええ、それはおそらく可能な限り最も残忍な解決策です^^)
デフォルトのタイムアウトは900秒です。別のタイムアウトを指定できます。
-T seconds
--timeout=seconds
デフォルトでは、20回再試行します。さまざまな試行を指定できます。
-t number
--tries=number
リンク:wgetmanドキュメント
バージョン1.14より前では、バグのためにhttps経由でダウンロードする場合、wgetタイムアウト引数は順守されませんでした。
あなたの質問でそれはPHPスクリプトだと言ったので、おそらく最良の解決策は単にスクリプトを追加することかもしれません:
ignore_user_abort(TRUE);
このようにして、wget
終了しても、PHPスクリプトは、少なくとも制限を超えなくなるまで処理され続けますmax_execution_time
(iniディレクティブ:デフォルトでは30秒)。
wget
とにかく、タイムアウトを変更しないでください。UNIXのマニュアルによると 、デフォルトのwgetタイムアウトは900秒(15分)で、whisは必要な5〜6分よりはるかに長くなります。
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待機することになります。