0

これまで何度も質問されたことがあるので、少し申し訳ありませんが、私が見つけたすべての答えが私の状況では機能しません。私は根本的に間違ったことをしているのか、それとも不可能なことをしようとしているのか。

Webブラウザ(Windows上で実行されているApache Webサーバーによって提供される)を介してアクセスされるPHPファイルからバックグラウンドプロセスをフォークできる必要があります。フォアグラウンドプロセスを終了する必要があるため、フォークされたプロセスがバックグラウンドで続行されている間、ブラウザーはサーバーの待機を停止します。PHP5.3を使用しています。

私は、さまざまな程度の失敗を伴う多数の提案された解決策を試しました。

shell_exec('D:\php5.3\php.exe sleep.php > out 2>out2' );

コマンドラインから実行した場合でも、ブラウザから実行した場合でも、フォアグラウンドプロセスは、バックグラウンドプロセスが完了するまで完了しませんでした。最後に「&」を追加しても違いはないようです

pclose(popen("start D:\php5.3\php.exe sleep.php","r"));

これはコマンドラインからは正常に機能しましたが、ブラウザからアクセスすると、フォアグラウンドプロセスとバックグラウンドプロセスの両方が終了するのを待ちました。

exec("nohup D:/php5.3/php.exe -f sleep.php > out 2>out2");

これはまったく機能しなかったようです

$commandString = "start /b D:/php5.3/php.exe d:\\webroot\\other\\tests\\sleep.php"; 
pclose(popen($commandString, 'r'));

コマンドラインで作業し、ブラウザで待機しました

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("D:/php5.3/php-win.exe -f d:\\webroot\\other\\tests\\sleep.php", 0, false);

まったく機能しませんでした-新しいプロセスをフォークしようとするとハングしました。

誰か助けてもらえますか?私は本当に明白な何かを逃していますか?!

タスクをデータベースにキューに入れてバッチで実行できることはわかっていますが、これを可能な限りリアルタイムで実行する必要があるため、キューに入れて最大1回しか実行できないような遅延を発生させたくありません。一分。

4

2 に答える 2

0

pcntl_fork 関数を試すことができます。これにより、バックグラウンドで作業の残りの作業を続行しながら、子プロセス (Web ページにサービスを提供) をフォークできます。ただし、注意して使用する必要があるものです。php.net のドキュメントを読んで、このアプローチを使用する際の複雑さを感じてください。

于 2012-07-30T20:37:38.527 に答える
0

この投稿でさえ時代遅れですが、他の人にとっては役立つかもしれません。これは私にとってはうまくいきました。解決策を見つけるのに何時間もかかりました!

function execInBack($phpscript, $args = array(), $logfile = '', $stdoutfile = '') {
if (count($args) == 0) {
    $args[] = md5(mt_rand());
}

$arg = '';

foreach ($args as $a) {
    $arg .= "\"$a\" ";
}

$cmd = "start /b c:\php\php5.3.10\php.exe ./$phpscript $arg";
$p = array();

$desc = array();
if ($logfile && $stdoutfile) {
    $desc = array(
        1 => array("file", $stdoutfile, "w"),
        2 => array("file", $logfile, "a")
    );
}

proc_close(proc_open($cmd, $desc, $p, getcwd()));

}

于 2014-01-04T03:09:35.190 に答える