7

私はモバイルアプリを持っています。

JqXHR = $.ajax({
    url: 'url',
    data: null,
    async: true,
    cache: false,
    dataType: 'json',
    type: 'GET',
    crossDomain: true,
    timeout: 63000,
    success: function(data, textStatus, jqXHR) {},
    error: function(jqXHR, textStatus, errorThrown) {}
});

リクエスト。もう一方の端でのユーザー操作を63秒間待機します(PHPバックエンドは約62秒間実行できます)。さて、その間にこのリクエストを中止することにした場合は、を呼び出しますJqXHR.abort()。エラーハンドラでは、実際のエラーとアボートをすでに処理/区別していますが、これは機能します。中止の直後に、他のAPI呼び出しをサーバーに送信して、ルーズエンドを結び付け、キャンセル要求がログに記録されていることを確認したいと思います。

そして問題があります。最初のリクエストでもabort()、PHPスクリプトはサーバー上で実行されています。これは、2番目のリクエストも実行した場合、問題にはなりません。これにより、停止してdie()になります。しかし、それは起こっていません。2番目の要求は、最初の要求が終了するまで発生しません。

何か案は?

jQuery 1.8.2、jQuery Mobile 1.2.0、PhoneGap 2.0.0および2.1.0、Apache 2、Linux、PHP 5.3

4

3 に答える 3

3

いくつかの情報:Parallel-AjaxとApache-セッションロック


セッションデータは通常、スクリプトが終了した後に保存されますが、同時書き込みを防ぐためにセッションデータがロックされているため、いつでも1つのスクリプトのみがセッションを操作できます

たとえば、フレームセットをセッションと一緒に使用する場合、このロックによりフレームが1つずつ読み込まれることがあります。できるだけ早くセッションを終了することで、すべてのフレームのロードに必要な時間を短縮できます。


したがって、ajaxスクリプトでセッションを使用できます。セッションは session_start();(おそらく自動的に処理されます)すぐに(できるだけ早く)続きます。session_write_close();

session_write_close();現在のセッションを「終了」し、セッションデータを保存します。

ただし、: session_id()は引き続き正しい(現在の)PHPSESSIDを提供するため、session_start()必要なときにいつでも再実行するだけで、現在のセッションへの書き込みアクセスを再取得できます。


すべてのajaxスクリプトでこのように使用して、セッション処理を実装し、並列リクエストを許可します

于 2013-01-29T12:54:28.990 に答える
1

古き良きPHPセッションとAJAXリクエストの問題に遭遇したようです。実際、上司は私が思いもよらなかったいくつかの表現をグーグルで調べてこの問題を知りました。バックエンドでZendフレームワークを使用していて、セッション名前空間が自動的に開始されるため、APIコントローラーのpreDispatch()メソッドに@session_write_close()を挿入する必要がありました。まるで魔法のように、それは魅力のように機能します。

迅速な返信をしてくれたArunに感謝します。

つまり、簡単に言うと、Zend Framework、session_autostart、またはセッションを開始する他の手段を使用する場合、それらは並列AJAXリクエストで飛行しません。

于 2012-10-12T14:49:02.100 に答える
0

このabortメソッドはサーバープロセスを終了せず、サーバーの応答を待つクライアント側を終了するだけです。

于 2012-10-12T13:27:07.907 に答える