【问题标题】:Perl LWP close connection manuallyPerl LWP 手动关闭连接
【发布时间】:2013-05-13 12:36:43
【问题描述】:

新问题:

我正在使用我的 Perl 脚本执行以下操作:

use strict;
use warnings;
use LWP 5.64;

my $browser = LWP::UserAgent->new();
$browser->credentials( 
'localhost:8080', 
'Tomcat Manager Application', 
'admin' => '123' 
);

my $app_url  = qq(http://localhost:8080/manager/list);
my $response = $browser->get( $app_url ); #this starts the Tomcat Manager Application
#do something
#end the tomcat manager application / terminate the session

有没有办法结束会话?我的 Manager 应用程序的默认会话超时为 30 分钟。我试过的是:

my $browser = LWP::UserAgent->new();
$browser->conn_cache(LWP::ConnCache->new());

但它仍然总是打开一个新会话。

我认为在这里更改 $browser->timeout 不是正确的方法,因为我需要在收到响应后终止会话。

任何帮助将不胜感激。


老问题:

有没有办法使用 LWP 手动结束我的会话?我有类似的东西:

use strict;
use warnings;
use LWP 5.64;

my $app_url = 'htpp://localhost:8080/manager/list'
my $base_url = 'http://localhost:8080'

my $browser = LWP::UserAgent->new;
$browser->credentials( 
 'localhost:8080/manager/list',
 'Tomcat Manager Application', 
 'admin' => '123' 
);

my $response = $browser->get( $base_url ); #session does not remain open
my $respuesta = $browser->get( $app_url ); #session remains opened 
#do some processing
#and now close the connection

我想连续多次运行我的脚本,一段时间后我在服务器上打开了一百万个会话。

提前感谢您的任何回答。

【问题讨论】:

  • 我打开metacpan.org/module/GAAS/libwww-perl-6.05/lib/LWP/UserAgent.pm 并搜索“连接”。第一个命中提到了一些关于 keep_alive 和连接缓存的内容。我有一种感觉,这可能会有所帮助。
  • 你的脚本还在运行吗?据我所知,LWP::UA 不会保持持久连接,除非您在新构造函数的选项哈希中特别请求它。我假设脚本在 linux 上运行,你能做一个netstat -lnp | grep 8080 看看是否 a) 有 perl/script 进程正在运行连接到端口 8080,b) 那个套接字的状态是什么? (即.. CLOSE_WAIT、CONNECTED 等)。
  • 谢谢。我认为这可能是 HTTP 基本身份验证问题? AFAIK 基本身份验证不支持“注销”。我的假设是 perl 中的退出会终止我的连接,但我错了。这也在Windows机器上运行。我相当确定它与 HTTP 基本身份验证有关,因为对基本 URL 的简单 GET 不会使会话保持打开状态。我相应地编辑了我的帖子。

标签: perl tomcat lwp basic-authentication lwp-useragent


【解决方案1】:

您可以为连接设置超时:

$browser->timeout([$secs])

默认情况下超时为 180 秒。您可以指定一个较小的值,连接会更快地关闭。

【讨论】:

  • 这很奇怪,但试试我的第二个选项 ;)
【解决方案2】:

试试这个:

my $response = $browser->get( $base_url ); #session does not remain open
my $respuesta = $browser->get( $app_url ); #session remains opened 
if($respuesta->is_success){
    #do some processing
    die "OK";
}
return 1;

【讨论】:

  • 感谢 dmitry,我很感激。但它仍然无法正常工作。我真的认为这是一个 HTTP Basic auth / Tomcat 问题。我尝试了 timeout 和上面提到的 keep_alive 选项,但两次都不起作用。基本上我正在做的是我用我的 Perl 脚本启动一个 Tomcat 应用程序,但我不知道如何关闭它。执行我的脚本每次都会打开一个新会话。我希望通过 keep_alive 可以解决这个问题
猜你喜欢
  • 2013-03-02
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 2017-03-12
  • 2016-10-12
  • 1970-01-01
相关资源
最近更新 更多