この質問は、私が以前に尋ねた質問に関連しています。こちらを参照してください。
セグメント化された ajax 応答を実装する方法として、これを行うコードを作成しました。
クライアントは最初に、プロセスを初期化するスクリプトを呼び出します。サーバー側では、startScript.cgi コードがデータの生成を開始し、これを行う際に応答をチャンクにグループ化し、それらを順番に索引付けされた個々のファイル (chunk1.txt、chunk2.txt など) に書き込みます。startScript.cgi がこのプロセスを開始した直後に、クライアント側は 2 番目の ajax 要求を開始し、gatherOutput.cgi にパラメーター ?index=0 を指定して送信します。
gatherOutput.cgi はリクエストを見て、'chunk'.$index.'.txt' を調べてデータを返します。クライアントはこれを html に出力し、パラメーター ?index=1 などを指定して、gatherOutput.cgi への 2 番目の ajax 要求を開始します。これは、startScript.cgi からのすべてのデータが報告されるまで続きます。
gatherOutput.cgi が「chunk$index.txt」を見つけられない場合、次のループに入ります。
until(-e "$directory/chunk$index.txt")
{
#nothing
}
open $fh, "<$directory/chunk$index.txt" || warn "File not found. blah blah";
#Read file and print, etc...
startScript.cgi は完了するまでに長い時間がかかる可能性のあるコードを実行することに注意してください。そのため、新しい出力を生成するときに startScript.cgi からの古い出力を同時にブロードキャストすることが重要です。
これに関する問題は、パフォーマンスが低下し、かなり前に作成されたにもかかわらず、出力が出るまでに時間がかかることです。これは、ハードドライブへのアクセスが startScript.cgi の CPU 操作に比べて非常に遅いことが原因であると想定しているため、gatherOutput.cgi は新しいチャンクが書き込まれるのを頻繁に待機しているか、またはクライアントが gatherOutput.cgi の読み取りを頻繁に待機しています。ファイルなど。ただし、他の問題がある可能性があります。
この問題を解決するためのアイデアや提案はありますか? または、誰かがこの問題に対して別のアプローチをとっていれば、それも素晴らしいでしょう。
ちなみに、startScript.cgi は 1 回しか呼び出されず、大きなタスク システム タスク (exec、system、backticks などのシステム エスケープを使用) を開始します。