2013-11-02 92 views
0

我已經有了這個腳本已經有兩年多了,直到兩週前從來沒有任何問題,我不知道爲什麼它突然停止完成。PERL:腳本沒有完成

服務器每天下載並解包一個大的xml文件(平均所有形式的109,000條記錄全部如下例所示),然後腳本將其從xml文件傳輸到mysql數據庫以進行存儲和查詢。

<ACCOUNT> 
<NAME>Name</NAME> 
<TYPE>Pretitle</TYPE> 
<FULLNAME>Fullname</FULLNAME> 
<MOTTO>Motto</MOTTO> 
<CATEGORY>Account Category</CATEGORY> 
</ACCOUNT> 

正如我所說的,我已經與它沒有任何問題了兩年多,但在過去兩個星期就68000後停止(平均或多或少)記錄已被轉讓,我真的很喜歡知道爲什麼。這是一個直接傳輸,我已經確認xml文件中有超過68,000條記錄。

下面是有問題的腳本。如果任何人都可以驗證這是一個堅實的腳本還是它有問題,我非常感謝它。我完全喪失了。

#!/usr/bin/perl 
print "Content-type: text/html; charset=iso-8859-1\n\n"; 
use strict; 
use DBI; 
use XML::Parser; 
my %row = ("NAME" => undef, "TYPE" => undef, "FULLNAME" => undef, "MOTTO" => undef, "CATEGORY" => undef); 
my $dbh = DBI->connect ("DBI:mysql:database:localhost", "username", "password", 
         { RaiseError => 1, PrintError => 0}); 
my $parser = new XML::Parser (
         Handlers => { 
          Start => \&handle_start, 
          End => \&handle_end, 
          Char => \&handle_text 
         } 
        ); 
$parser->parsefile ("accounts.xml"); 
$dbh->disconnect(); 
sub handle_start 
{ 
my ($p, $tag) = @_; 
    if ($tag eq "ACCOUNT") 
    { 
     foreach my $key (keys (%row)) 
     { 
      $row{$key} = undef; 
     } 
    } 
} 

sub handle_text 
{ 
my ($p, $data) = @_;  
    my $tag = $p->current_element(); 
    $row{$tag} .= $data if exists ($row{$tag}); 
} 

sub handle_end 
{ 
my ($p, $tag) = @_; 
    if ($tag eq "ACCOUNT") 
    { 
     my $str; 
     foreach my $key (keys (%row)) 
     { 
      $str .= "," if $str; 
      $str .= "$key=" . $dbh->quote($row{$key}); 
     } 
     $dbh->do ("INSERT INTO TABLE SET $str"); 
    } 
} 
+6

錯誤信息?退出代碼? – ikegami

+0

爲什麼輸出一個HTTP頭? – friedo

+0

我沒有得到任何指標,除記錄沒有加起來以外,任何事情都是錯誤的。在瀏覽器中運行它只是出現一個500錯誤,您希望在瀏覽器中運行腳本需要20分鐘才能完成該錯誤。偶爾我會手動運行腳本,儘管不是那麼頻繁。 HTTP頭在代碼中已經使用了好幾年了,而且我的理解是,爲了從瀏覽器運行腳本,需要使用它。它沒有任何問題。 –

回答

0

將插入代碼放在「eval {};」中;部分。然後在腳本的最後打印$ @。

這將a)意味着異常被捕獲並且腳本可以完成(很可能沒有問題的行)並且b)您可以從$ @的內容中看到什麼令您的腳本感到不安。