Perl Net :: FTP对象预期重用行为?

时间:2012-09-27 18:08:26

标签: perl ftp

使用quit后,我似乎无法重用Net :: FTP对象。

这是预期的吗?我无法从文档(cpan)中了解到。

作为一种解决方法,每次我需要执行一批ftp操作时,我都会创建一个新的Net :: FTP对象。这似乎很浪费。

以下示例显示:成功初始登录,打印根目录ls,退出(套接字关闭),登录失败并显示ftp消息“Connection closed”。

#!/usr/bin/env perl

use strict;
use warnings;

use Net::FTP;

my $hostname = 'foo';
my $username = 'bar';
my $password = 'baz';

# successful first pass
my $ftp = Net::FTP->new( $hostname ) or die "cannot connect to $hostname: $@";
$ftp->login( $username, $password ) or die "cannot login: ", $ftp->message;
map { print "ls_output: $_\n" } $ftp->ls; # success
$ftp->quit or die "cannot close connection: ", $ftp->message;

# re-use attempt
$ftp->login( $username, $password ) or die "cannot login: ", $ftp->message;

# never gets here since re-use attempt fails
print "done!\n";

3 个答案:

答案 0 :(得分:2)

quit导致远程端关闭连接,没有关闭连接就无法注销。如果你试图避免重新连接,你就不能。

另一方面,也许您期望login将您连接到服务器。连接在new中创建,而不是在login中创建,Net :: FTP不提供重新连接的方法。

Net :: FTP子类IO :: Socket :: INET,因此您可以使用IO :: Socket :: INET的connect重新连接,但是您还必须重新初始化一个或两个构造函数的字段初始化。没什么好复杂的。

但是,是否还有一个需要修复的问题?您谈到效率低下,但与创建FTP连接相比,创建和初始化对象所花费的时间相形见绌。

答案 1 :(得分:0)

这不是Perl问题。这是FTP协议。发出quit之后......就是这样,FTP会话结束了。没有什么可以发出login命令 - 没有人再听了。

使用FTP客户端在命令行上自行尝试。

答案 2 :(得分:0)

从您链接的这份文档中

  放弃 ()      

将QUIT命令发送到远程FTP服务器并关闭套接字连接。

关闭套接字连接会终止与服务器的连接,而不仅仅是此服务器上的会话。

为每个连接创建一个新对象有两个缺点:

  1. Perl可能会也可能不会将旧对象的数据保存在内存中 - 但垃圾收集不应该打扰你。

  2. 创建新连接需要一些开销。但除非你每秒创建几十个新的连接,否则这不应该打扰你。

  3. 所以每次只创建新对象;如果您愿意,可以重复使用相同的变量。在Perl中思考太低级别,过早优化只会受到伤害。