2012-01-10 10 views
0

私はPHPコードで1つのjquery ajaxリクエストを呼び出しています。このコードはデータベースからデータを取り出し、Excelファイルにエクスポートします。一旦AJAXのリクエストが成功すれば、私はExcelのファイルポップアップダウンロードボックスを入手します。この機能はすべてのブラウザで正常に動作しています。jQuery Ajax:* async *が成功するまで待つ方法

jqueryリクエストに時間がかかり(7-8分)、Excelファイルがサーバー上に作成されますが、ダウンロードボックスがポップアップされず、30分後にタイムアウトエラーが発生する場合があります。

問題が発生する可能性がありますが、ファイルは7分でサーバー上に作成されますが、私はajaxリクエストから何の応答も得られません。また、ajaxリクエストのタイムアウトが30分に設定されていることも確認されています。

+0

をポーリングする

$.post({ url: '/export/', ... success: function(data) { $('.status').html('Export in progress. Please wait...'); } }); 

第二AJAX呼び出し:エクスポートのステータスを示していたクラスのステータスを持つDIV

輸出を開始するために最初にAJAX呼び出しをしていると仮定すると、

あなたのクライアントは、ファイルのダウンロードを開始するのに7〜8分待つでしょうか?試したコードを入力してください。 –

+0

あなたはそれがExcelファイルの作成から来ると思いますか?コードを試してその部分を無効にし、何かが起きたかどうかを確認してください – user1040899

+0

resultSetsで試しましたか? – Sandeep

答えて

0

あなたは間違っている:あなたのアプリケーションからサービスを受けるために、ユーザーがたった数秒間ページにくっついてしまうことを強要したくありません。

代わりに、ステータスページ(もちろんajax)を定期的に問い合わせるウィジェットを使用し、ジョブが完了したらメッセージを表示します。

(生成する7分を取っているExcelファイルのどのようなDBのダンプ?)

編集:

異なるブラウザが長いAjaxのリクエストで異なる動作をしますので、待っているそれらに依存しません。ユーザーが喜んでいる場合でも永遠に。レポート生成のリクエストとレポートのダウンロードを切り離すと、アプリはより堅牢になります。

このあなたに私が話しているかのアイデアを与える必要があります。

create_my_excel_file.php:

$_SESSION['excel_status']='generating'; 
create_the_excel_file(); 
$_SESSION['excel_status']='finished'; 

をcheck_status.php:

echo $_SESSION['excel_status']; 

user_interface.php:

<script type="text/javascript"> 
function initiateRequest(){ 
    $.ajax('create_my_excel_file.php'); 
    setInterval('checkForCompletion()', 5000); 
} 
function checkForCompletion(){ 
    $.get('check_status.php', function(data){ 
     if('finished'==data){ 
      alert('Completed! Download the file now.'); 
      location.href='file_download.php'; 
     } 
    }); 
} 
</script> 
<a href="javascript:initiateRequest();">Generate the file</a> 
+0

このモジュールはレポートであり、管理者のみがアクセスできます。レコードはLacsにあり、それが何分かかります。時間が問題ではない、20分かかる場合は、それも良いです。しかし、なぜAjaxリクエストが長いリクエストに対して応答しないのか。\ – user1138143

+0

この問題を処理する最も簡単な方法。出力バッファリングはphp.iniでオンになっています。私のローカルワンプサーバーで同じコードが実行されています。たとえ私が2行のコードを書いても<?php sleep(300); ?>、それは5分後に応答していません。 – user1138143

+0

すべてを一気にやろうとするのは難しくなります。長い時間待たなければならない場合、リクエストが失敗するのは簡単です。それを簡単にして、小さくて簡単なステップに分けてください。 – bdares

1

あなたがタイムアウトを解決することができたとしても、進歩のフィードバックなしにクライアントが7〜8分待つことは、理想からはほど遠いでしょう。より良い方法はをサーバーにエクスポートしてすぐに戻ることになります。これが返ってくると、「エクスポートが進行中です...」という何かの進捗メッセージを表示できます。その後、定期的にエクスポートの状態をチェックし、適切なステータスメッセージを返すAJAX呼び出しを行うことができます。エクスポートが完了すると、進捗のフィードバックを「エクスポート完了:ファイルをダウンロードする」に変更できます。ダウンロードファイルはサーバー上に作成されたExcelファイルへのリンクになります。コードを介してそのリンクのクリックをトリガして自動的にダウンロードを開始することもできます。

すなわちその輸出進捗

$.post({ 
    url: '/exportstatus/', 
    ... 
    success: function(data) { 
    if(data=='OK') { 
     $('.status').html('Export complete: <a class="exportedfile" href="/path/to/exported/file">Download File</a>'); 
     setTimeout(function() { 
      $('.status').find('a').click(); // trigger autostart of download 
}, 1000); 
    } 
    } 
}); 
+0

この問題を処理する最も簡単な方法です。出力バッファリングはphp.iniでオンになっています。私のローカルワンプサーバーで同じコードが実行されています。たとえ私が2行のコードを書いても<?php sleep(300); ?>、5分後に応答していません。 – user1138143

関連する問題