5

PHPシステムコールでJavaプログラムを呼び出しています。Javaプログラムの実行にはしばらく時間がかかりますが、最終的には既知のファイル名のPDFファイルが生成されます。

このファイルが存在するまでチェックを続けてから、そのファイルへのリンクを提供する必要があります。whileループが含まれると思いますが、リソースを大量に消費することは望ましくありません。これを行うための良い方法は何ですか?

4

3 に答える 3

6

基本的に、あなたはそれを正しく理解しました

while (!file_exists($filename)) sleep(1);
print '<a href="'.$filename.'">download PDF</a>';

スリープはチェックの間に 1 秒を与えるので、CPU に無駄なストレスを与えません。

于 2011-05-03T13:56:10.893 に答える
3

これでうまくいきますが、追加のタイムアウトを指定することもできます。

while( !file_exists($pathToFile) )
{
    sleep(1);
}
于 2011-05-03T13:55:13.853 に答える
1

ブラウザに送り返す必要がある場合は、setIntervalタイマーでAJAX呼び出しを使用し、ファイルの存在を確認するPHPスクリプトを使用して調査する必要があります。これは2つの方法で実行できます。

  1. flush()htmlをブラウザに戻します。これには、ブラウザのポーリング側にAJAXを使用してポーリングプロセスを開始するJavasciptと、ポーリングを処理するためのAJAX関数を備えたPHPスクリプトが含まれています。

  2. うまくいかない場合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ルートをお勧めしますが、トラフィックが少ない場合は上記のコードをお勧めします。

于 2011-05-03T14:12:50.203 に答える