1

私は現在、データベースから提供された一連の引数を持つ3つ(またはそれ以上)のphpスクリプトを起動するために使用しようとしているperlスクリプトを持っています:

$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 スクリプトの結果は気にしません。一度にすべてを開始するか、非常にわずかな遅延で開始する必要があります。

フェッチは適切に機能し、3 つの一意の値のセットを返します。ただし、最初の php スクリプトを起動することは決してないようです。エラーメッセージは表示されません。

どんな助けでも大歓迎です。

4

2 に答える 2

1

あなたはそれのために使うことができ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);
}
于 2012-07-23T09:02:51.237 に答える
0

から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.

于 2012-07-23T09:00:47.980 に答える