1
我使用從CPAN獲得的AnyEvent :: Twitter :: Stream模塊。我也是Perl的新手,並且根據某些條件從Twitter流API中讀取推文後,我從示例修改的此腳本觸發了一個事件,以便將一些Twitter數據插入到數據庫中。我有刪節一些代碼,但低於一般的信息是:錯誤時重新啓動Perl腳本? (Perl Newbie)
#!/usr/bin/perl
use strict;
use AnyEvent::Twitter::Stream;
use DBI;
use DBD::mysql;
my $done = AnyEvent->condvar;
my($user, $password, $method, $args) = @ARGV;
# my twitter login
my %args;
if ($method eq 'follow') {
$args{follow} = $args;
$method = 'filter';
} elsif ($method eq 'track') {
$args{track} = $args;
$method = 'filter';
}
binmode STDOUT, ":utf8";
my $streamer = AnyEvent::Twitter::Stream->new(
username => $user,
password => $password,
timeout => 0,
method => $method || "sample",
%args,
on_keepalive => sub {
warn "ping\n";
},
on_tweet => sub {
my $DBIconnect;
#db connection info
my $dsn = "dbi:mysql:$database:$host:$dbport";
$DBIconnect = DBI->connect($dsn, $db_user, $db_pass);
my $tweet = shift;
if($tweet->{id}) {
# occasionally twitter
# insert some data here
my $save_tweet = $query;
#print $query;
my $save_handle = $DBIconnect->prepare($save_tweet);
if($save_handle->execute()) {
#print "Tweet #" . $tweet->{id} . " Stored\n";
} else {
#print "Error Saving Tweet #" . $tweet->{id} . "\n";
}
$save_handle->finish();
$DBIconnect->disconnect();
} else {
#print "Tweet did not contain Tweet ID.\n";
}
},
on_error => sub {
my $error = shift;
print "Error! Error!";
warn "ERROR: $error";
$done->send;
sleep 2;
$done->recv;
},
on_eof => sub {
$done->send;
},
);
$done->recv;
在這個過程中,偶爾會流或應用程序將退出該故弄玄虛還是我的原因。我想等待3秒鐘,然後重新啓動整個perl腳本(或簡單的AnyEvent實例)以繼續讀取數據。
您可能注意到,我試圖用這個:
on_error => sub {
my $error = shift;
print "Error! Error!";
warn "ERROR: $error";
$done->send;
sleep 2;
$done->recv;
},
這似乎並不重新啓動該進程。任何人都可以向我提供任何有關這將需要什麼的見解?
perl腳本將退出(停止接收)當事件ON_ERROR被調用。您的解決方案似乎通常涵蓋了基本問題,流模塊基本上說錯誤:(這是我想要捕捉的)然後退出。我想我不會在PHP中使用evals。謝謝! – culthero
@Zack - 'eval'以它的塊形式(谷歌「perldoc eval」)捕獲'DIE'信號,所以任何執行錯誤處理的'die'語句都會 - 而不是崩潰腳本 - 僅僅從' eval'並將死亡錯誤消息內容設置爲'$ @'。 – DVK