2011-10-10 32 views
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; 
    }, 

這似乎並不重新啓動該進程。任何人都可以向我提供任何有關這將需要什麼的見解?

回答

2

我對模塊並不熟悉,但您需要更清楚地知道「流或應用程序會因爲仍然使我困惑的原因而退出」的含義。腳本死了嗎?

如果是這樣,捕獲錯誤並重新啓動的方法之一是包裹整個代碼中的eval如下:

my $continue = 1; 
while ($continue) { 
    eval { # Catch "die" event 
     my $streamer = xxx 
     # some other call to start the streamer??? 
    }; 
    if ([email protected] =~ /specific error message substring you wish to restart on/) { 
     # Do some prep work if needed 
    } else { 
     $continue = 0; # quit on next loop iteration 
     # As alternative to using $continue flag, just do: 
     # last; 
    } 
} 
+0

perl腳本將退出(停止接收)當事件ON_ERROR被調用。您的解決方案似乎通常涵蓋了基本問題,流模塊基本上說錯誤:(這是我想要捕捉的)然後退出。我想我不會在PHP中使用evals。謝謝! – culthero

+0

@Zack - 'eval'以它的塊形式(谷歌「perldoc eval」)捕獲'DIE'信號,所以任何執行錯誤處理的'die'語句都會 - 而不是崩潰腳本 - 僅僅從' eval'並將死亡錯誤消息內容設置爲'$ @'。 – DVK