使用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";
答案 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服务器并关闭套接字连接。
关闭套接字连接会终止与服务器的连接,而不仅仅是此服务器上的会话。
为每个连接创建一个新对象有两个缺点:
Perl可能会也可能不会将旧对象的数据保存在内存中 - 但垃圾收集不应该打扰你。
创建新连接需要一些开销。但除非你每秒创建几十个新的连接,否则这不应该打扰你。
所以每次只创建新对象;如果您愿意,可以重复使用相同的变量。在Perl中思考太低级别,过早优化只会受到伤害。