2013-11-02 90 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)您可以从$ @的内容中看到什么令您的脚本感到不安。