0

quit を使用した後、Net::FTP オブジェクトを再利用できないようです。

これは期待されていますか?ドキュメントからはわかりませんでした(cpan)。

回避策として、ftp 操作のバッチを実行する必要があるたびに、新しい Net::FTP オブジェクトを作成しています。これは無駄に思えます。

次の例は、初期ログインの成功、ルート ディレクトリ ls の出力、終了 (ソケット クローズ)、ftp メッセージ「接続が閉じられました」でログインが失敗したことを示しています。

#!/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";
4

3 に答える 3

2

quitリモートエンドが接続を閉じ、接続を閉じずにログアウトする方法がありません。再接続を避けようとしている場合は、できません。

一方、loginサーバーに接続することを期待しているかもしれません。接続はnewではなく で作成され、 loginNet::FTP は再接続の手段を提供しません。

Net::FTP は IO::Socket::INET をサブクラス化するため、IO::Socket::INET の を使用して再接続できますがconnect、コンストラクターが通常初期化する 1 つまたは 2 つのフィールドを再初期化する必要もあります。複雑なことは何もありません。

しかし、修正が必要な問題はありますか? 非効率だとおっしゃいますが、オブジェクトを作成して初期化するのにかかる時間は、FTP 接続を確立するのにかかる時間と比較すると見劣りします。

于 2012-09-27T18:23:36.873 に答える
0

これは Perl の問題ではありません。それがFTPプロトコルです。がquit発行されたら... 以上で、FTP セッションは終了です。コマンドを発行するものは何もありloginません。もう誰も聞いていません。

FTP クライアントを使用して、コマンド ラインで試してみてください。

于 2012-09-27T18:21:16.500 に答える
0

リンクしたこのまさにドキュメントから:

終了する ()

QUIT コマンドをリモート FTP サーバーに送信し、ソケット接続を閉じます。

ソケット接続を閉じると、このサーバー上のセッションだけでなく、サーバーへの接続も終了します。

接続ごとに新しいオブジェクトを作成することには、次の 2 つの欠点があります。

  1. Perl は、古いオブジェクトからのデータをメモリ内に保持する場合と保持しない場合がありますが、ガベージ コレクションを気にする必要はありません。

  2. 新しい接続の作成には、いくらかのオーバーヘッドが伴います。しかし、毎秒数十の新しい接続を作成していない限り、これは気にする必要はありません。

したがって、毎回新しいオブジェクトを作成するだけです。必要に応じて、同じ変数を再利用できます。Perl のレベルが低すぎると考えたり、最適化が早すぎたりするのは害になるだけです。

于 2012-09-27T18:24:00.963 に答える