Как запустить несколько огонь и забыть 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.

Другие вопросы по тегам