PHPシステムコールでJavaプログラムを呼び出しています。Javaプログラムの実行にはしばらく時間がかかりますが、最終的には既知のファイル名のPDFファイルが生成されます。
このファイルが存在するまでチェックを続けてから、そのファイルへのリンクを提供する必要があります。whileループが含まれると思いますが、リソースを大量に消費することは望ましくありません。これを行うための良い方法は何ですか?
PHPシステムコールでJavaプログラムを呼び出しています。Javaプログラムの実行にはしばらく時間がかかりますが、最終的には既知のファイル名のPDFファイルが生成されます。
このファイルが存在するまでチェックを続けてから、そのファイルへのリンクを提供する必要があります。whileループが含まれると思いますが、リソースを大量に消費することは望ましくありません。これを行うための良い方法は何ですか?
基本的に、あなたはそれを正しく理解しました
while (!file_exists($filename)) sleep(1);
print '<a href="'.$filename.'">download PDF</a>';
スリープはチェックの間に 1 秒を与えるので、CPU に無駄なストレスを与えません。
これでうまくいきますが、追加のタイムアウトを指定することもできます。
while( !file_exists($pathToFile) )
{
sleep(1);
}
ブラウザに送り返す必要がある場合は、setIntervalタイマーでAJAX呼び出しを使用し、ファイルの存在を確認するPHPスクリプトを使用して調査する必要があります。これは2つの方法で実行できます。
flush()
htmlをブラウザに戻します。これには、ブラウザのポーリング側にAJAXを使用してポーリングプロセスを開始するJavasciptと、ポーリングを処理するためのAJAX関数を備えたPHPスクリプトが含まれています。
うまくいかない場合flush()
は、Javaプロセスを開始する前に、PHPスクリプトのHTMLを返す必要があります。そのコードに2つのAJAX呼び出しを入れます。1つは実際のJavaプロセスを開始し、もう1つはファイルを探すポーリングサービスを開始します。
長時間実行されるスクリプトは、Javaアプリケーションから応答を取得する前にブラウザーをタイムアウトする可能性があります。そのため、ブラウザーがJavaプロセスから非同期で動作する必要がある可能性があります。
一方、これが実行中の純粋なPHPスクリプトである場合、またはJavaプロセスが通常のブラウザーのタイムアウトよりも短い場合は、次のようなものを使用できます。
$nofileexists = true;
while($nofilexists) { // loop until your file is there
$nofileexists = checkFileExists(); //check to see if your file is there
sleep(5); //sleeps for X seconds, in this case 5 before running the loop again
}
これがトラフィックの多い通話(多くのパブリックユーザー向け)なのか、レポートタイプのアプリケーションなのかについては言及していません。トラフィックが多い場合はAJAXルートをお勧めしますが、トラフィックが少ない場合は上記のコードをお勧めします。