-4

実行するジョブのリストをデータベースに照会し、データベースで見つかったもの (基本的にはプロセス キュー) に基づいて他の PHP スクリプトを起動する PHP スクリプトがあります。

キュー ランナー スクリプトが実行するスクリプトの中には、実行が完了するまでに 30 秒程度かかるものがあります (ビデオの変換、画像のサイズ変更など)。

問題は、キュー ランナー スクリプトの shell_exec() が処理スクリプトを呼び出しますが、スクリプトが終了するのを待たず、キューが完了しないことです。

キュー ランナー スクリプト:

#!/usr/bin/php
<?php
    // Loop through database and find jobs to be done
    shell_exec("nohup $command > /dev/null 2> /dev/null & echo $! &");
?>

コマンド ラインからジョブ スクリプトを直接実行すると、PDF が作成されます。

これを修正する方法についてのアイデアはありますか? または、プロセス キューを実行するためのより良い方法はありますか?

4

2 に答える 2

3

shell_execは問題の原因ではありません。待機して、コマンドの出力を返します。ただし、バックグラウンドでnohupを使用してコマンドを開始しないでください。

nohupは呼び出しているコマンドですが、子プロセスを開始するとすぐに終了するため、shell_execはそのプロセスが完了するのを待ちません。&を使用してバックグラウンドでコマンドを実行することも控えてください。

于 2012-07-17T14:05:14.670 に答える
0

まず、PHPからコードを実行するのではなく、可能な限りPHPラッパーとライブラリを使用することをお勧めします。

私が見ている問題の1つは、処理が同期していることです。これは、サーバーが何が起こっているのかについての手がかりなしにサーバーが応答するのをユーザーが待たなければならないことを意味します。彼はページを更新することさえあり、それは制御なしであなたのサーバーの負荷を増加させるでしょう、そしてこれは非常に深刻な問題です。これにより、DOS攻撃が可能になります。

これらの長時間実行されるタスクにはAJAXをお勧めします。Webページに進行状況を表示して、完了したら更新(AJAX)するか、別のページに切り替えることができます。javascriptでそのイベントをキャッチし、プロセスを強制終了することで、ユーザーがページを終了した場合にも対処できます。

于 2012-07-17T14:06:49.240 に答える