0

時間がかかり、待ちたくないので、バックグラウンドでphpスクリプトを実行したいと思います。

この質問は以下に関連しています。

php バックグラウンドプロセスを実行する

Linux centos マシンでこれを機能させようとしましたが、残念ながら機能していないようです。

これは私のコードです:

$cmd = 'php '.realpath($_SERVER["DOCUMENT_ROOT"]).'/test/sample.php';

exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));
exec(sprintf("$s > $s 2>&1 & echo $1", $cmd, $outputfile),$pidArr); 

sleep(2);

print_r($outputfile);
print_r($pidfile);

sample.php スクリプトが完成していることを確認するために、sleep(2) を含めました。sample.php には、echo 'Hello world' のみが含まれています。両方の実行オプションを試しましたが、どれも機能しませんでした。上記のスクリプトは出力を表示しません。

同じ $cmd を Linux コマンド ラインで実行しようとしたところ、sample.php スクリプトからの出力が表示されました。

これを最初に実行したいのですが、さらに変数を sample.php スクリプトにも送信したいと考えています。

よろしくお願いいたします。

4

3 に答える 3

1

バックグラウンドで php スクリプトを実行するこのアプローチは、少し厄介に思えます。また、ユーザー入力に基づいて追加のパラメーターを渡すかどうかによっては、攻撃者が追加のコマンドを挿入できるシナリオも作成される可能性があります。

このような使用例では、すぐに応答が必要ない場合は cron を使用するか、Gearman サーバーを使用して要求とバックグラウンド ジョブの間の通信を管理できるGearmanのようなジョブ マネージャーを使用できます。

于 2013-07-06T15:27:08.150 に答える
0

若干の調整をしました

$cmd = 'php '.realpath($_SERVER["DOCUMENT_ROOT"]).'/test/sample.php';
$outputfile = 'ouput.txt';
$pidfile = 'pid.txt';
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));
exec(sprintf("$s > $s 2>&1 & echo $1", $cmd, $outputfile),$pidArr); 

sleep(2);

print_r(file_get_contents($outputfile));
print_r(file_get_contents($pidfile));

以前に変数を定義したかどうかはわかりません。Windowsでテストしましたが、動作します

于 2013-07-06T14:48:27.110 に答える