Как запустить несколько огонь и забыть PHP-скрипты с Perl?
В настоящее время у меня есть Perl-скрипт, который я пытаюсь использовать для запуска трех (или более) PHP-скриптов, каждый с набором аргументов, предоставляемых из базы данных:
$sql = "SELECT id,url,added,lasttotal,lastsnapshot,speed,nextsnapshot FROM urls WHERE DATE(NOW()) > DATE(nextsnapshot) LIMIT 0,3";
$sth = $dbh->prepare($sql);
$sth->execute or print "SQL Error: $DBI::errstr\n";
my ($urlID, $url, $added,$lastTotal,$lastSnapshot,$lastSpeed,$nextsnapshot);
$sth->bind_col(1, \$urlID);
$sth->bind_col(2, \$url);
$sth->bind_col(3, \$added);
$sth->bind_col(4, \$lastTotal);
$sth->bind_col(5, \$lastSnapshot);
$sth->bind_col(6, \$lastSpeed);
$sth->bind_col(7, \$nextsnapshot);
while ($sth->fetch) {
$myexec = "php /usr/www/users/blah/blah/launch_snapshot.php '$url' $urlID '$added' $lastTotal '$lastSnapshot' $lastSpeed".' /dev/null 2>&1 &';
exec ($myexec) or print "\n Couldn't exec $myexec: $!";
}
Меня не волнуют какие-либо результаты из сценариев PHP, мне просто нужно запустить их все сразу или с очень небольшой задержкой.
Выборка работает правильно и возвращает три уникальных набора значений. Тем не менее, кажется, что запуск первого php-скрипта не проходит. Я не получаю никаких сообщений об ошибках.
Любая помощь будет наиболее ценной.
2 ответа
Решение
Вы могли бы использовать fork
или просто system
для этого.
С помощью fork
:
foreach($sth->fetch) {
my $pid = fork();
if($pid) { # Parent
waitpid($pid, 0);
} elsif ($pid == 0) { # A child
$myexec = "...";
exec($myexec) or print "\n Couldn't exec $myexec: $!";
exit(0); # Important!
} else {
die "couldn't fork: $!\n";
}
}
С помощью system
:
foreach($sth->fetch) {
$myexec = "...";
system($myexec);
}
От perldoc -f exec
exec LIST
exec PROGRAM LIST
The "exec" function executes a system command and never
returns-- use "system" instead of "exec" if you want it to
return. It fails and returns false only if the command does
not exist and it is executed directly instead of via your
system's command shell (see below).
Вы хотите system
(или же fork
) не exec.