如何更快地分析 HTTP Post 响应
How to analyze HTTP Post response faster
我编写了一个定期检查数据的简单程序。问题是检查过程会随着时间的推移而变慢。首先它在一秒内发送 2 posts,大约 45s 后它发送一个 post,最终它完全停止。我不知道这里有什么问题。
procedure TForm2.CheckURLs;
var
lHTTP: TIdHTTP;
IdSSL : TIdSSLIOHandlerSocketOpenSSL;
N: Integer;
Access: string;
Params, Reply: TStringList;
Cookie: TIdCookie;
begin
lHTTP := TIdHTTP.Create(nil);
try
IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
IdSSL.SSLOptions.Method := sslvTLSv1;
IdSSL.SSLOptions.Mode := sslmClient;
lHTTP.IOHandler := IdSSL;
lHTTP.ReadTimeout := 30000;
lHTTP.HandleRedirects := True;
lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36';
lHTTP.Get('https://www.mywebserver.com', TStream(nil));
Cookie := lHTTP.CookieManager.CookieCollection.Cookie['id', 'www.mywebserver.com'];
if Cookie <> nil then
Access := Cookie.Value;
finally
end;
Params := TStringList.Create;
Reply := TStringList.Create;
TTask.Create(
procedure
var
N, m, i : integer;
begin
Params.Add('IDs=' +B.Strings[i]);
try
lHTTP.Request.CustomHeaders.Values['id'] := Access;
lHTTP.Request.CustomHeaders.Values['X-Requested-With'] := 'XMLHttpRequest';
lHTTP.Request.Referer := 'https://www.mywebserver.com/';
lHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36';
lHTTP.ConnectTimeout := 0;
Reply.Text := lHTTP.Post('https://www.mywebserver.com/', Params);
if AnsiContainsStr(Reply.Text, 'nothing') then
begin
TThread.Synchronize(nil,
procedure
begin
Memo1.Lines.Add(B.Strings[i]);
Label2.Caption := Memo1.Lines.Count.ToString;
end
);
end;
finally
Reply.Clear;
end;
end
).Start;
end;
你的速度慢可能来自你程序的这两部分:
下载数据或处理数据。
根据经验,我怀疑该网站拖慢了您的速度,因此您可以尝试在下载过程后注释掉所有内容(当然要小心)。 运行 这个程序应该再次给出相同的结果,然后在网站上给我们确认 "fault"。
为避免因反机器人保护而被阻止 45 秒,请尝试通过在每次请求后添加几秒钟的暂停来预防性地减慢您的程序。
即使没有保护,放慢我们的网络机器人也是一个好习惯。我们不做 DoS :)
除了technicolor所说的,TTask
在Delphi 10.1 Berlin中有已知的时序问题,例如:
RSP-15233: TTask Stuck and take a very very long time to start
RSP-12557: TTask serialize parallel tasks without apparent reason
为避免这些问题,请尝试使用 TThread.CreateAnonymousThread()
而不是 TTask
。
我编写了一个定期检查数据的简单程序。问题是检查过程会随着时间的推移而变慢。首先它在一秒内发送 2 posts,大约 45s 后它发送一个 post,最终它完全停止。我不知道这里有什么问题。
procedure TForm2.CheckURLs;
var
lHTTP: TIdHTTP;
IdSSL : TIdSSLIOHandlerSocketOpenSSL;
N: Integer;
Access: string;
Params, Reply: TStringList;
Cookie: TIdCookie;
begin
lHTTP := TIdHTTP.Create(nil);
try
IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
IdSSL.SSLOptions.Method := sslvTLSv1;
IdSSL.SSLOptions.Mode := sslmClient;
lHTTP.IOHandler := IdSSL;
lHTTP.ReadTimeout := 30000;
lHTTP.HandleRedirects := True;
lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36';
lHTTP.Get('https://www.mywebserver.com', TStream(nil));
Cookie := lHTTP.CookieManager.CookieCollection.Cookie['id', 'www.mywebserver.com'];
if Cookie <> nil then
Access := Cookie.Value;
finally
end;
Params := TStringList.Create;
Reply := TStringList.Create;
TTask.Create(
procedure
var
N, m, i : integer;
begin
Params.Add('IDs=' +B.Strings[i]);
try
lHTTP.Request.CustomHeaders.Values['id'] := Access;
lHTTP.Request.CustomHeaders.Values['X-Requested-With'] := 'XMLHttpRequest';
lHTTP.Request.Referer := 'https://www.mywebserver.com/';
lHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
lHTTP.Request.UserAgent := 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36';
lHTTP.ConnectTimeout := 0;
Reply.Text := lHTTP.Post('https://www.mywebserver.com/', Params);
if AnsiContainsStr(Reply.Text, 'nothing') then
begin
TThread.Synchronize(nil,
procedure
begin
Memo1.Lines.Add(B.Strings[i]);
Label2.Caption := Memo1.Lines.Count.ToString;
end
);
end;
finally
Reply.Clear;
end;
end
).Start;
end;
你的速度慢可能来自你程序的这两部分: 下载数据或处理数据。
根据经验,我怀疑该网站拖慢了您的速度,因此您可以尝试在下载过程后注释掉所有内容(当然要小心)。 运行 这个程序应该再次给出相同的结果,然后在网站上给我们确认 "fault"。
为避免因反机器人保护而被阻止 45 秒,请尝试通过在每次请求后添加几秒钟的暂停来预防性地减慢您的程序。 即使没有保护,放慢我们的网络机器人也是一个好习惯。我们不做 DoS :)
除了technicolor所说的,TTask
在Delphi 10.1 Berlin中有已知的时序问题,例如:
RSP-15233: TTask Stuck and take a very very long time to start
RSP-12557: TTask serialize parallel tasks without apparent reason
为避免这些问题,请尝试使用 TThread.CreateAnonymousThread()
而不是 TTask
。