记录错误程序

来源:互联网 发布:阿里云活体核验照片 编辑:程序博客网 时间:2024/05/02 11:23
昨天快下班的时候发现发邮件的程序出现了问题。原因是:
同事每次需要我发送的邮件量月30多封,而我的程序每分钟只发送20封甚至更少。我又是放到crond里跑的,所以问题就出现了,crond没有等上个程序运行完毕又开始了下一个作业!(OMG)

之前做过将perl程序做成deamon的东西,之后我就想是不是因为一分钟间隔太长了,所以又把程序做成了deamon,时时在跑。但是随后我发现,这样问题仍旧没有解决,发送出去的信件还是很少。
问题在哪里呢?

查原程序,我的程序大致逻辑是这样的:
模块:
package MySMTP
...
sub new {
my $self = {};
$self->{DBH} = DBI->connect_cached(....);
return $self;
}

sub get_list {
...
return @list;
}

sub sendMail { # 这个sub大部分是直接copycpan上的,没怎么理解
my ($self,$to,$content) = @_;

$self->{SMTP} = Net::SMTP->new("xx.xx.xx.xx"); #同网段的SMTP
$self->{SMTP}->mail(xxx.s@soch.com);
$self->{SMTP}->to($to);
$self->{SMTP}->data();
$self->{SMTP}->datasend
$self->{SMTP}->datasend("/n");
$self->{SMTP}->datasend('To: '.$to);
$self->{SMTP}->datasend("/n");
$self->{SMTP}->datasend('Content-type:text/html;Charset=utf8');
$self->{SMTP}->datasend("/n");
$self->{SMTP}->datasend("Subject: hello");
$self->{SMTP}->datasend("/n/n");
$self->{SMTP}->datasend("$content/n");
$self->{SMTP}->dataend();
$self->{SMTP}->quit;
}

然后,就用一个脚本调用我的module了:
  ...
use MySMTP;
$mail = new MySMTP();
my @lists = $mail->get_list();

for my $addr (@list) {
$mail->sendMail($addr,"how are you");
}


仔细分析一下就会发现,每循环一次 @list,就调用一次sendMail,即建立一次SMTP连接,我调试的时候发现,光建立这个连接就要耗时5s!难怪程序慢呢。
随后,我将  NET::SMTP->new从 sendmail移动到模块的new 里,然后又建立了一个 sub finish{}函数用于关闭 SMTP连接 :(将sendMail里的注释掉)
sub finish {
my $self = @_;
$self->{SMTP}->quit;
}
在脚本的最后再调用此方法!最终问题得以解决。每次建立smtp连接一次,大约5s。但是后来的发送邮件,20~40封之内的,耗时至多两秒,呵呵。总共说来,1分钟跑一次处理任务是绰绰有余啊。


原创粉丝点击