0

処理に異常な時間がかかる可能性のあるiframeラッパーのPOSTを介していくつかのファイルをアップロードしています。

そして、iframeのonloadイベントによってキャプチャされる結果を出力する前に、アップロードが終了し、処理が開始されたことをユーザーに何らかの方法で知らせたいと思います。

そうしないと、ユーザーは長時間の待機に混乱する可能性があります。

最初のメッセージを表示し、完了したら別の行を追加して、出力されたページのコンテンツをiframeで比較することを考えていました。しかし、このアプローチは何らかの理由で機能しません。

例:

print 'processing started';
for ($i=0; $i < 10; $i++) { 
    echo '...still processing';
    sleep(1);
}
echo 'done';

(「処理が開始されました」というメッセージが表示され、読み込みが完了すると「完了」が表示されることを期待していますが、10秒間待機した後、1回のバーストで吐き出されます)。

だから私はこれをどのように行うことができるのだろうか?

私が持っていたもう1つの考えは、ページの最初にリダイレクトヘッダーを設定することでした。そのため、ファイルがアップロードされると、別のページにリダイレクトされ、そこで処理が行われます。次に、リダイレクトと最終応答をキャプチャしてみます。

しかし、それはちょっと奇妙な方法です。送信されたパラメータを渡し、アップロードされたファイルを一時フォルダのどこかに移動する必要があるため、phpスクリプトが出力された後は削除されません。

...それで、私がやろうとしていることを行うためのより良いアプローチがあるのだろうか?

4

1 に答える 1

1

ファイルのアップロードが完了すると、PHPが呼び出され、(a)ファイルを目的の場所に配置し、(b)応答としてブラウザーにHTMLを発行し、(c)場合によっては処理を開始できます。

したがって、ファイルを保存してから、サーバー上でバックグラウンドジョブとして処理を開始します(execなどのシステムコールの1つを介して開始されたコマンドラインPHPを使用して別のPHPスクリプトを実行します)。ジョブに一意のIDを指定します。これにより、(a)IDに従って名前が付けられた一時ファイルを作成し、(b)HTMLのどこかでブラウザーに渡して、ファイルがまだ存在するかどうかを照会できます。(c)ジョブが終了すると、そのファイルが削除されるため、完了したことがわかります。

これで、アップロードに応答するHTMLページに「アップロードが終了し、処理が開始されました」と表示され、サーバーをポーリングするJavascriptを実行して(Ajaxを使用-jQueryで非常に簡単、XMLHttpRequestを直接使用するのはそれほど難しくありません)、ジョブが終了したかどうかを確認できます(ポーリングされたリクエストのURLのクエリ文字列でジョブを識別します)。サーバー上のポーリングスクリプトは、関連するファイルがまだ存在するかどうかを確認し、存在する場合は、それに応じて「いいえ、まだ機能しています」または「はい、完了しました」と表示します。

アップロードされたファイルを順番に処理している場合など、ジョブがどの程度進んでいるかを知る方法がある場合は、ジョブに進行状況のパーセンテージを定期的にファイルに書き込み、ポーリングに応答してそれを返すことができます。クライアント側でそれをプログレスバーとして表示します。

于 2012-08-28T19:46:11.473 に答える