Witam,
Skrypty Perl w LMS wykonywane są w jednym wątku. W Perlu 5.10 da się
podzielić zadania na wątki. Dla potomnych mających wieloprocesorowe
serwerki i dużo klientów wycinek z lms-sendinvoice przerobiony na dwa
wątki (tylko dal MySQL):
my $thr1 = threads->new(\&senda,"1",$end);
my $thr2 = threads->new(\&senda,$end);
$thr1->join;
$thr2->join;
sub senda{
my @parametry = @_;
my $start=$parametry[0];
my $end=$parametry[1];
my $dbase = DBI->connect("DBI:mysql:database=$dbname;host=
$dbhost","$dbuser","$dbpasswd", { RaiseError => 1 });
$dbase->do("SET NAMES utf8");
my $queryend="";
if($end)
{
$queryend="AND d.customerid<$end";
}
my $send_dbq = $dbase->prepare("SELECT d.id, d.number, d.cdate,
c.email, d.name, d.customerid, n.template
FROM documents d
LEFT JOIN customers c ON (c.id = d.customerid)
LEFT JOIN numberplans n ON (n.id = d.numberplanid)
$groupjoin
WHERE c.deleted = 0 AND d.type = 1 AND c.email != ''
AND d.cdate >= $daystart AND d.cdate <= $dayend AND c.invoicenotice
= 1 AND
d.customerid>$start $queryend $groupwhere");
$send_dbq->execute();
while(my $send_row = $send_dbq->fetchrow_hashref())
{
...............
return;
}#zamknięcie sub
W zasadzie ma jeden słaby punkt - każdy wątek łączy się z bazą i
wykonuje mniejsze zapytanie SQL. Lepiej było by najpierw wykonać SQL a
następnie wysyłkę podzielić na wątki. Z automatu odpadł by problem baz
uwzględnionych w oryginale. Na tyle na ile skrypt był testowany działa
prawidłowo.