PERL: скрипт не завершен

0

У меня был этот сценарий уже более двух лет и никогда не возникало проблем до двух недель назад, и я понятия не имею, почему это внезапно прекратило завершение.

Каждый день сервер загружает и распаковывает большой 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");
   }
}
  • 6
    Сообщение об ошибке? Код выхода?
  • 0
    Почему это выводит заголовок HTTP?
Показать ещё 9 комментариев
Теги:

1 ответ

0

Поместите код, который делает вставку, в "eval {};" раздел. Затем распечатайте $ @в конце вашего скрипта.

Это будет означать, что исключение поймано и скрипт может завершиться (скорее всего, без соответствующей строки), и b) вы можете увидеть из содержимого $ @, что нарушает ваш скрипт.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню