2013-03-28 13 views
11

2つの同時AJAX要求の実行に問題があります。私はXSLXにデータをエクスポートしているPHPスクリプトを持っています。この操作には多くの時間がかかるため、ユーザーに進捗状況を表示しようとしています。私はAJAXとデータベースアプローチを使用しています。実際には、私はそれが動作するために使用されていたと確信していますが、私は理由を把握することはできません、それはもはや任意のブラウザで動作していません。新しいブラウザで何か変わったのですか?2つの同時AJAX要求は並列に実行されません。

$(document).ready(function() { 

     $("#progressbar").progressbar(); 

     $.ajax({ 
      type: "POST", 
      url: "{$BASE_URL}/export/project/ajaxExport", 
      data: "type={$type}&progressUid={$progressUid}" // unique ID I'm using to track progress from database 
     }).done(function(data) { 
      $("#progressbar-box").hide(); 
      clearInterval(progressInterval); 
     }); 

     progressInterval = setInterval(function() { 
      $.ajax({ 
       type: "POST", 
       url: "{$BASE_URL}/ajax/progressShow", 
       data: "statusId={$progressUid}" // the same uinque ID 
      }).done(function(data) { 
       data = jQuery.parseJSON(data); 
       $("#progressbar").progressbar({ value: parseInt(data.progress) }); 
       if (data.title) { $("#progressbar-title").text(data.title); } 
      }); 
     }, 500); 

    }); 
  • JSタイマーが進行を取得しようとしているの進歩が正しくデータベース
  • に更新されて、私はコンソールでそれを見ることができますが、これらすべての要求は、最初のスクリプトの全期間をロードしています、スクリプトが終了すると、これらのajax進行コールがロードされます

なぜ、2番目のAJAXコールが最初のコールを待っているのですか?

+3

一部のPHP Webサーバー構成では、セッションごとに1つの接続のみを同時に実行できます。したがって、セッションを使用している場合は、(a)セッションを開始し、(b)60秒間スリープするページで実験を試してください。次に、このページの複数のインスタンスを同じブラウザにロードしてみてください。 – halfer

+0

最近jQueryバージョンを更新しましたか? –

+1

また、一般に、複数のAJAX運用は、過剰なHTTPコールに対して時間を浪費するため、ベストプラクティスではありません。それらを1つにマージし、いくつかの結果をJSON文字列に戻すことはできますか? – halfer

答えて

28

は、ファイルにそのセッションデータを書き込むデフォルトPHPでは問題

をブロックセッションのような音。 session_start()でセッションを開始すると、書き込みのためにファイルが開き、同時に編集されないようにロックされます。これは、セッションを使用してPHPスクリプトを実行する各リクエストについて、最初のセッションがファイルで処理されるのを待たなければならないことを意味します。

<?php 
    session_start(); // starting the session 

    $_SESSION['foo'] = 'bar'; // Write data to the session if you want to 

    session_write_close(); // close the session file and release the lock 

    echo $_SESSION['foo']; // You can still read from the session. 
+2

非常に助かります!ありがとうございます –

+0

Ay carumba。 PHPセッションのファンではなく、Symfonyを使って開発しています。理にかなっているが、推測できないだろう。良い助け! – eggmatters

0

をあなたはまた

async: true, 
+0

これはExtJs用ですか? – Sangoku

2

を設定することができ、髪の少し後:

この問題を解決する方法は、ファイルを使用しないようにかそこらのようなあなたのセッションの書き込みを閉じるためにPHPのセッションを変更することです-Pulling、私は1つを見つけましたこれらの非並列AJAXリクエストは、PHPセッション処理とはまったく無関係に起こる可能性があります。

XDebugはこれを引き起こす可能性があり、Zend Debuggerもこの問題を引き起こす可能性があります。

は、私の場合、私が持っていた:私の地元のLAMPスタックに

  • xdebug.remote_autostartをインストール

    • のXDebugは私のIDEは何もブレークポイントがアクティブ
    なかったにもかかわらず、インバウンドデバッガ接続を受け入れる
  • を有効に

    これは、すべてのAJAXテストが何であっても順番に実行されるようにしました。振り返ってみると、(デバッグの観点から)逐次処理を強制するのはかなり意味がありますが、私のIDEがまだ舞台裏でやり取りしていたことに気付かなかっただけです。

    IDEに完全にリッスンを停止するように指示した後、並列実行が再開され、私が探していたレース状態を再現することができました。

  • +0

    それは非常に知って良いです! – chrislondon

    0

    APIで作業する場合、異なるエンドポイントに複数のAJAX要求を発行する必要が生じることがあります。あるリクエストが完了するのを待ってから次のリクエストを発行するのではなく、jQueryの$を使って、データを並行して要求することで、jQueryで処理を高速化できます。()関数は:

    Run multiple AJAX requests in parallel

    0

    a.phpは、2つの同時AJAXはb.phpとc.php呼び出し含むメインHTMLページを生成します。 b.phpとc.phpがセッション変数を共有するためには、最初のAJAX呼び出しの前にセッション変数が存在していなければなりません。これが真であれば、a.phpとb.phpはセッション変数の値を変更し、お互いの値を見ることができます。したがって、HTMLページを生成している間にa.phpでセッション変数を作成してください。

    1

    出力バッファリングを有効にした場合(PHP 7以降ではデフォルト)、session_write_close()[answer of chrislondon]は問題を解決できないことに注意してください。 php.iniでoutput_buffering = Offを設定する必要があります。そうしないと、セッションが正しく閉じられません。

    関連する問題