2

ユーザーの操作後にサーバー上でバックグラウンドで実行したい、長時間実行される PHP スクリプトがあります。コマンドがバックグラウンドで実行されている間、ユーザーは他のページにリダイレクトされる必要があります。以下はコードです

$command = exec('php -q /mylongrunningscript.php');
header("Location: /main.php?action=welcome");

上記のスクリプトは正常に実行されていますが、 が $command = exec('php -q /mylongrunningscript.php');実行されるまでページはリダイレクトされません。

そのユーザーをすぐにウェルカム ページにリダイレクトする必要があります。

このタスクを達成する他の方法はありますか。別のアイデアは、 $command = exec('php -q /mylongrunningscript.php'); というものです。ウェルカム ページで実行する必要がありますが、コマンドの実行後にウェルカム ページの HTML が表示されます。コマンドには約 5,6 分かかり、この時間はページがリダイレクトされません。

私はPHP 5.3を搭載したCent OS Linuxを使用しています

4

3 に答える 3

3

代わりにこれを試すことができますか:

$result = shell_exec('php -q /mylongrunningscript.php > /dev/null 2>&1 &');

PS: これは stdout と stderr をリダイレクトすることに注意してください。/dev/null出力をキャプチャする場合は、次を使用します。

$result = shell_exec('php -q /mylongrunningscript.php > /tmp/script.our 2>&1 &');

または、この PHP 関数を使用して、Unix コマンドをバックグラウンドで実行します。

//Run linux command in background and return the PID created by the OS
function run_in_background($Command, $Priority = 0) {
    if($Priority)
        $PID = shell_exec("nohup nice -n $Priority $Command > /dev/null & echo $!");
    else
        $PID = shell_exec("nohup $Command > /dev/null & echo $!");
    return($PID);
}

礼儀: http://php.net/manual/en/function.shell-exec.phpに投稿されたコメント

于 2013-01-02T09:34:53.900 に答える
2

exec()PHPのマニュアルページに記載されているように:

プログラムがこの関数で開始された場合、バックグラウンドで実行を継続するには、プログラムの出力をファイルまたは別の出力ストリームにリダイレクトする必要があります。そうしないと、プログラムの実行が終了するまで PHP がハングアップします。

2>&1(基本的に 2 はstderrで 1 は です。つまりstdout、これが意味するのは、「すべての stderr メッセージを stdout にリダイレクトする」ということです):

shell_exec('php -q /mylongrunningscript.php 2>&1');

または、出力内容を知りたい場合:

shell_exec('php -q /mylongrunningscript.php 2>&1 > output.log');
于 2013-01-02T09:36:27.740 に答える
1

スクリプト出力を /dev/null に送信すると、exec 関数がすぐに戻ります

$command = exec('php -q /mylongrunningscript.php > /dev/null 2>&1');
于 2013-01-02T09:36:10.787 に答える