0

スクリプトがバックグラウンドで実行されるように、最後に記号が付いた次のexec()コマンドがあります。&ただし、スクリプトはバックグラウンドで実行されていません。正確に 5.6 分後にブラウザーでタイムアウトになります。また、ブラウザを閉じると、スクリプトが実行されなくなります。

 exec("/usr/local/bin/php -q /home/user/somefile.php &")

コマンドラインからスクリプトを実行すると、タイムアウトしません。私の質問は、タイムアウトを防ぐ方法です。ブラウザに依存しないように、exec を使用してバックグラウンドでスクリプトを実行するにはどうすればよいですか。私は何を間違っていて、何を見なければなりませんか。

4

2 に答える 2

4

exec()関数は実行されたプログラムからの出力を処理するため、出力を/dev/null(書き込み可能な仮想ファイルで、書き込むすべてのデータを自動的に失う) にリダイレクトすることをお勧めします。

実行してみてください:

exec("/usr/local/bin/php -q /home/gooffers/somefile.php > /dev/null 2>&1 &");

注 :2>&1エラー出力を標準出力に> /dev/nullリダイレクトし、標準出力をその仮想ファイルにリダイレクトします。

それでも問題が解決しない場合は、他のスクリプトを実行するだけのスクリプトを作成できます。exec()タスクを実行中はプロセスに従いますが、タスクが終了すると解放されます。実行されたスクリプトが別のスクリプトを実行するだけの場合、タスクは非常に高速で、exec は同じ方法で解放されます。

実装を見てみましょう。exec.php次を含む を作成します。

<?php

  if (count($argv) == 1)
  {
    die('You must give a script to exec...');
  }
  array_shift($argv);
  $cmd = '/usr/local/bin/php -q';
  foreach ($argv as $arg)
  {
     $cmd .= " " . escapeshellarg($arg);
  }
  exec("{$cmd} > /dev/null 2>&1 &");

?>

次に、次のコマンドを実行します。

exec("/usr/local/bin/php -q exec.php /home/gooffers/somefile.php > /dev/null 2>&1 &");

引数がある場合は、それらも指定できます。

exec("/usr/local/bin/php -q exec.php /home/gooffers/somefile.php x y z > /dev/null 2>&1 &");
于 2012-11-29T23:04:56.030 に答える
0

shell_exec()代わりに次を使用する必要があります。

shell_exec("/usr/local/bin/php -q /home/gooffers/somefile.php &");

そうは言っても、シェルにアクセスできるのであれば、これを cron ジョブとしてインストールしてみませんか? PHPスクリプトが別のスクリプトを呼び出してこのように実行する理由がわかりません。

于 2012-11-29T22:51:39.227 に答える