2

フォームを表示する以下のコードがあります。アップローダーの div セクションには gif 画像が表示され、ファイルがサーバーによって処理されていることをユーザーに伝えます。ファイルが処理されると、div 'outdata' は ajax 呼び出しからの出力を保持します。私のファイルには多くの情報が含まれているため、サーバーでの処理に時間がかかります。最後のファイルに約 12.11 分かかったとしましょう。

私の質問は、小さなファイルをアップロードすると、完全に正常に動作することです。応答は outdata div セクションに表示されます。ただし、ファイルサイズが大きい場合、サーバーがファイルを出力するように見えますが、それは私に電子メールで送信されるためですが、ブラウザのページには同じことが反映されません。ファイルがまだ処理中であり、画像が画面に表示されたままになっていることを示しています。

1)。ajax が応答テキストを送り返すのをブラウザーが待機する時間 2)。これを行うより良い方法はありますか?

echo "<form name=\"cre\" id=\"cre\" action=\"#\" method=\"post\" enctype=\"multipart/form-data\">";
    echo "<label for=\"file\">Filename: </label>";
    echo "<input type=\"file\" name=\"file\" id=\"file\" ><br><br>";
    echo "<label for=\"email\">Email: </label>";
    echo "<input id=\"email\" type=\"text\" name=\"email\" maxlength=\"40\"><br><br>";  
    echo "<input type=\"submit\" onclick=\"return validate();\" id=\"submit\" value=\"Submit\">&nbsp;&nbsp;";
    echo "</form>";
    echo "<BR>";
    echo "<div id=\"uploader\"></div>";
    echo "<BR>";
    echo "<div id=\"outdata\">";
    echo "</div>";

これはajax呼び出しです

function validate() 
            {
                var file = $("#file").val();
                if(!file || file == '' || file == null)
                {
                    document.getElementById("outdata").innerHTML="Please select a file";
                    return false;
                }   
                var options = {
                    target: '#outdata',
                    url:'process.php', 
                    data:{
                        accesstype:"cre"
                    },
                    beforeSubmit: function() {
                        $('#uploader').html('<img src="/images/ajax-loader.gif" />');
                        $('input[type=submit]').attr('disabled', true);
                    },
                    success:  function() {

                        $('#uploader').html('');
                        $('input[type=submit]').attr('disabled', false);
                    }
                };
                $('#cre').ajaxSubmit(options);
                return false;   
            }
4

1 に答える 1

3

これは、クライアント側ではなく、サーバー側のタイムアウトです。Ajax 呼び出しにハンドラーを実装してerrorいないため、Apache (およびその同類) が 30 秒または 60 秒後に要求を自動的に終了することはわかりません ( で構成可能apache2.conf)。

最大リクエスト時間を増やすことはオプションですが、サーバー リソースを詰まらせるため、悪い方法です。これを非同期で処理することをお勧めします。

  1. ファイルが正常にアップロードされたら、成功コードを Ajax 呼び出しに返します。これにより、エンド ユーザーに、コーヒーを飲みに行って処理を待つことができるという有用なフィードバックを提供することもできます。
  2. バックグラウンド ジョブを生成するか、cron でキュー内のファイルを取得して処理を開始します。
  3. ロング ポーリング メカニズム (または、順調に進んでいる場合は Websockets) を使用して、サーバーとの長年にわたる関係を開き、プロセスに関する更新を要求します。これは、「はい/終了していません」、またはプロセスのパーセンタイル更新のいずれかです。インラインではなくバックグラウンドで処理を開始すると、すべてが可能になります。

データベース(アップロード時にジョブを挿入し、処理ジョブがそのテーブルのステータスを更新できるようにする)またはプレーンなフォルダーベースのキューイングシステム(にアップロード/incoming、cronはそのフォルダーをスキャンし、完了したら移動し/processingて削除する)を使用してシステムを実装できます)。

あなたのウェブサーバーと彼のシステム負荷はあなたに感謝します;)

于 2013-06-05T01:31:31.740 に答える