アップデート
理論に取り組んでLWP/Protocol/http.pm
、サブルーチンに sleep ステートメントを含めるように編集しましたrequest
。
if (!$has_content || $write_wait || $has_content > 8*1024) {
WRITE:
{
# Since this just writes out the header block it should almost
# always succeed to send the whole buffer in a single write call.
my $n = $socket->syswrite($req_buf, length($req_buf));
sleep 2; ## <----- NEW
unless (defined $n) {
...
そしてget
ステートメントは機能し、 . を返しました200 OK
。コード内のこの特定の場所をデバッグして見つけるのを手伝ってくれたAlan Curryに感謝します。
それが質問に完全に答えるかどうか、または解決策が長期的に機能するかどうかはわかりません。さらにチェックを行う必要があります。
概要:
- サブルーチンを使用するLWP::UserAgentモジュール
get
が一部の URL で失敗し、500 タイムアウトが報告されます。 - 一部のURLのみが失敗します。たとえば
www.google.com
、失敗しますが、www.google.se
成功します。 - 他に接続の問題はありません。すべての URL は、ブラウザや ping などの cmd プログラムからアクセスできます。
- この問題のため、CPAN や ActivePerl の ppm で perl のモジュールをインストールできません。
- 別の perl ディストリビューションをインストールした後も問題は解決しませんでした。
- 奇妙なことに、デバッガーを使用してコードをステップ実行すると、失敗した URL が成功します。
- 私はファイアウォールを使用しており、perl は接続を許可されています。(一部の URL は成功するため、関係ありません)
- ファイアウォール ログは、perl が失敗した URL と失敗していない URL の両方で接続を許可されていることを示しています。(以下を参照) ログにはリッスンするために開いているソケットも示されますが、失敗した接続のタイムスタンプが一致しません。
ゴール
- 私は主に、モジュールをインストールできるソリューションを探しています。
- 問題をデバッグする方法に関するすべての提案に興味があります。完全な解決策は必要ありません。ヒントやヒントは大歓迎です。
推敲
しばらくの間、ActivePerl v5.14 を使用しています。Perl Package Managerppm
コマンドと GUI を使用したモジュールのインストールは非常にうまく機能しましたが、ある時点で機能しなくなり、500 タイムアウトが報告されました。cpan シェルはまったく同じことを報告しました。
私はこの問題を広範囲にグーグルで検索しましたが、私の問題に関連するもの、または何らかの形で役立つものは何も見つかりませんでした.
ActivePerl サポートは、ばかげているプロキシ設定である可能性があると主張しています。プロキシ設定を必要としないインターネットに接続するプログラムがたくさんありますが、私の知る限り、これを行う必要はありません。プロキシ設定がある場合はそれを見つけようとしましたが、「システム設定を使用する」、「プロキシは必要ありません」、「プロキシは IP と同じです」などの漠然とした参照しか見つかりませんでした。
そのため、昨夜は十分な量のストロベリー perl を代わりにインストールしましたが、同じ問題に悩まされています。その後、ActivePerl をアンインストールしました。
とにかく、LWP モジュールを試してみたところ、そこでエラーを再現できることがわかりました。特定の Web サイトに限定されているようで、cpan もその 1 つ (?) です。テスト用に次のスクリプトを作成しました。
use strict;
use warnings;
use LWP::UserAgent;
use URI;
my $ua = LWP::UserAgent->new;
my $url = shift;
my $u = URI->new($url);
$ua->no_proxy('cpan.strawberryperl.com','cpan.com',$u->host);
$ua->timeout(30);
my $r = $ua->get($url);
if ($r->is_success) {
print $r->decoded_content;
} else {
die $r->status_line;
}
そして、いくつかのテストを行いました:
tx.pl http://cpan.strawberryperl.com/authors/01mailrc.txt.gz
500 read timeout at tx.pl line 23.
tx.pl http://stackoverflow.com
500 read timeout at tx.pl line 23.
tx.pl http://www.google.se
<!doctype html><html itemscope itemtype="http://schema.org/WebPage"><head><meta
http-equiv="content-type" content="text/html; charset=ISO-8859-1"><meta ...
したがって、google は機能し、www.youtube.com も機能しますが、www.yahoo.com と search.cpan.com は機能しません。デフォルトの 180 秒のタイムアウトにより、デバッグが非常に煩わしくなります。そのため、スクリプトでタイムアウトを減らしました。言うまでもなく、これらの URL はすべて、Firefox または ping でアクセスしようとすると到達可能です。
到着予定時刻:
奇妙なことに、スクリプトをデバッガーで実行し、トレースをオンにして最後までスキップすると、以前に失敗した接続が成功します。
数千行のトレース コードを出力するためにスクリプトの実行速度が遅くなると、ある種の問題やタイミングのずれが「修正」されていることを暗示しているように思われます。
この問題は、一部の ActivePerl モジュールが破損した結果であると理解できましたが、ストロベリー perl はまったく別のファイル セットを使用しているため、私のシステムに違いありません。
一部のサイトが機能し、一部のサイトが機能しない理由は不可解です。stackoverflow.com のような一部のサイトが潜在的なボットから身を守ることは理解できましたが、cpan が独自のパッケージ マネージャーを妨害する理由は理解できません。
私はファイアウォールを使用しており、Perl は接続を許可されています。私のシステムは、Windows XP のかなり古いインストール (~5 年) です。Ubuntu でデュアル ブートを実行している間、この問題に遭遇したことはありません。これは、プロキシとは関係がないというもう 1 つの手がかりです。
私は元気で、本当に困惑しています。誰かがこれをデバッグするのを手伝ってくれたら、とても感謝しています。
以下の CPAN シェル エラー メッセージ。面白いことに、最後の手段として ftp を使用しようとしていると書かれていますが、ファイアウォールで ftp コマンドが許可されていないことに気付きました。
Fetching with LWP:
http://cpan.strawberryperl.com/authors/01mailrc.txt.gz
LWP failed with code[500] message[read timeout]
Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt
.gz.tmp1252'. Giving up on it.
Fetching with LWP:
http://www.cpan.org/authors/01mailrc.txt.gz
LWP failed with code[500] message[read timeout]
Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt
.gz.tmp1252'. Giving up on it.
Warning: no success downloading 'D:\strawberry\cpan\sources\authors\01mailrc.txt
.gz.tmp1252'. Giving up on it.
As a last resort we now switch to the external ftp command 'C:\WINDOWS\system32\
ftp.EXE'
to get 'D:\strawberry\cpan\sources\authors\01mailrc.txt.gz.tmp1252'.
Doing so often leads to problems that are hard to diagnose.
If you're the victim of such problems, please consider unsetting the
ftp config variable with
o conf ftp ""
o conf commit
Please check, if the URLs I found in your configuration file
(http://cpan.strawberryperl.com/, http://www.cpan.org/) are valid. The
urllist can be edited. E.g. with 'o conf urllist push ftp://myurl/'
Could not fetch authors/01mailrc.txt.gz
失敗していない URL (www.google.se) と失敗した (stackoverflow.com) をフェッチしようとするファイアウォール ログ:
2012-06-27T18:34:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,56564
2012-06-27T18:34:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53
2012-06-27T18:34:13+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:34:13+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:34:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80
2012-06-27T18:34:28+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:34:30+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,56664
2012-06-27T18:34:30+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53
2012-06-27T18:34:30+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,74.125.143.94,80
2012-06-27T18:34:30+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,74.125.143.94,80
2012-06-27T18:35:14+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:35:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80
2012-06-27T18:36:21+01:00,info,appl control,C:\Program\Mozilla Firefox\firefox.exe,allow,connect out,6,74.86.70.106,80
2012-06-27T18:37:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,listen,17,0.0.0.0,61215
2012-06-27T18:37:04+01:00,info,appl control,C:\WINDOWS\system32\svchost.exe,allow,send,17,195.54.122.198,53
2012-06-27T18:37:07+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80
2012-06-27T18:37:07+01:00,info,appl control,D:\strawberry\perl\bin\perl.exe,allow,connect out,6,64.34.119.12,80