【问题标题】:PERL: Script Not CompletingPERL:脚本未完成
【发布时间】:2013-11-13 16:39:06
【问题描述】:

我已经有了这个脚本两年多了,直到两周前才出现任何问题,我不知道为什么它突然停止完成。

服务器每天都会下载并解压一个大型 xml 文件(平均 109,000 条记录,所有记录都像下面的示例一样形成。)然后脚本将其从 xml 文件传输到 mysql 数据库以进行存储和更轻松的查询。

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

正如我所说,两年多来我一直没有遇到任何问题,但在过去的两周里,它在 68,000 条(平均或多或少)记录被转移后停止了,我真的很想知道原因。这是直接转移,我已经确认在 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");
   }
}

【问题讨论】:

  • 错误信息?退出代码?
  • 为什么会输出 HTTP 标头?
  • 除了记录没有加起来之外,我没有任何迹象表明有任何问题。在浏览器中运行它只是超时,出现 500 错误,您期望在浏览器中运行脚本需要 20 分钟才能完成。偶尔我会手动运行脚本,但并不经常。 HTTP 标头已在代码中多年,据我了解,它是从浏览器运行脚本所必需的。它在那里没有任何问题。
  • 是的,在过去的三天里,我多次手动运行脚本,几分钟后浏览器中出现的只是 500 内部服务器错误。该脚本不断添加记录,我通过刷新 phpMyAdmin 中的表来确认。记录总是在 68,000 左右停止。我还在我的编辑器中打开了每个新的 xml 文件,并让程序找到并用 替换每个 实例。完成后,程序会返回 109,000 个已更改的实例。
  • 您需要先检查您的网络服务器错误日志文件。看起来你的脚本运行超时了。

标签: mysql xml perl


【解决方案1】:

将执行插入的代码放在“eval { };”中部分。然后在脚本末尾打印出 $@。

这将 a) 意味着异常被捕获并且脚本可以完成(很可能没有相关行)并且 b) 您可以从 $@ 的内容中看到什么让您的脚本感到不安。

【讨论】:

    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多