12

私はこれをphpスクリプトで呼び出しています:

    exec("gutschein.php >/dev/null 2>&1 &");

スクリプトの呼び出し (pdf を生成して電子メールで送信) は機能しますが、プロセスはバックグラウンドで実行されていません(gutschein.php 内の sleep ステートメントで確認しました)。ブラウザーは、gutschein.php の実行が完了するまでハングします。

また、次のことも確認しました。

    exec("/usr/bin/php gutschein.php >/dev/null 2>&1 &");

また

shell_exec("/usr/bin/php gutschein.php >/dev/null 2>&1 &");

何も変わりません。スクリプトは実際には Linux サーバー上で実行されています。私が間違っていることを誰かが知っていますか?

4

7 に答える 7

4

システムおよび/またはパススルーを試してください。プロセスが完了するまで戻り配列にデータを入力しようとして停止するため、以前に exec に問題がありました。

これらは両方とも生の出力をエコーするため、機能する場合でも、破棄された出力バッファーで処理する必要がある場合があります。

于 2012-11-01T14:58:54.850 に答える
1

次の2つのコマンドのいずれかを試して、PHPからバックグラウンドジョブを実行できますか?

$out = shell_exec('nohup /usr/bin/php /path/to/gutschein.php >/dev/null 2>&1 &');

また

$pid = pclose(popen('/usr/bin/php gutschein.php', 'r'));

コマンドをバックグラウンドで実行し、PIDを返します。これは、条件$pid > 0を使用してチェックし、機能していることを確認できます。

于 2012-09-18T12:29:52.807 に答える
1

画面を使用できます:screen -d -m /usr/bin/php gutschein.php

オプションに関する詳細情報が必要な場合は、screen のマニュアルを参照してください

于 2012-11-01T15:29:20.193 に答える
1

ここで私の経験をご覧ください。私が試し、私のために働く方法 -

php -q /path/to/my/test/script/cli_test.php argument1 < /dev/null &

PHPでは、次のようになります

exec('php -q /path/to/my/test/script/cli_test.php argument1 < /dev/null &')
于 2014-03-28T06:29:47.110 に答える
1

すべての出力をリダイレクトする必要があります。リダイレクトしないと、gutschein.php が実行されている限り、スクリプトがハングします。試す

exec('/usr/bin/php gutschein.php &> /dev/null &');
于 2012-09-18T12:30:33.770 に答える
1
    /**
     * @author Micheal Mouner
     * @param String $commandJob
     * @return Integer $pid
     */
    public function PsExec($commandJob)
    {
        $command = $commandJob . ' > /dev/null 2>&1 & echo $!';
        exec($command, $op);
        $pid = (int) $op[0];
        if ($pid != "")
            return $pid;
        return false;
    }

これは私のために働いた..それを確認してください

また、バックグラウンド プロセスの processId を返す

于 2012-10-10T11:03:19.757 に答える
-3

ブラウザが応答を待っている可能性があるため、スクリプトで出力を生成し、「メイン プロセス」を終了させます。シンプルな

die('ok');

仕事をするべきです。


ところで、exec を呼び出して新しいプロセスをフォークすることは、新しいプロセスが実際の子プロセスではないため、最適な解決策ではない可能性があります。つまり、制御できないことを意味します。この目的でpcntl ( http://php.net/manual/de/book.pcntl.php ) を使用することを検討してください。しかしはっきり言って、この拡張機能には彼の落とし穴もあり、特に Web サーバーのコンテキストではそうです。

于 2012-09-18T12:30:19.467 に答える