У меня был этот сценарий уже более двух лет и никогда не возникало проблем до двух недель назад, и я понятия не имею, почему это внезапно прекратило завершение.
Каждый день сервер загружает и распаковывает большой 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");
}
}
Поместите код, который делает вставку, в "eval {};" раздел. Затем распечатайте $ @в конце вашего скрипта.
Это будет означать, что исключение поймано и скрипт может завершиться (скорее всего, без соответствующей строки), и b) вы можете увидеть из содержимого $ @, что нарушает ваш скрипт.