7

長い処理時間を必要とするリクエストを送信するクライアント側があり、クライアントはajaxでリクエストを送信します。サーバーでリクエストが受け入れられると、クライアントは別のページにリダイレクトします。これはfastcgi_finish_requestによって実行されます(私はphp-fpmを実行しています)

LongWork.php:

<?php
    fastcgi_finish_request(); 
    sleep(1000); //Simulate long computation time
?>

client.js:

$.ajax({
    url: "...",
    data: {},
    success: function() {
        top.location.href="next_page.php" 
    }
});

ajaxが送信され、コールバックが成功すると、期待どおりにnext_page.phpにリダイレクトされます。

しかし、その後ページが停止し、スリープが終了するまでサービスを受けられません。私の接続は同じphp-fpmプロセスが終了するのを待っているようです

私はphp-fpmでnginxを実行していますが、なぜこれが発生するのですか?

編集

さらに調査した結果、この動作の原因は、(facebook SDKからの)アクティブなセッションがあることであることがわかりました。LongWork.phpでセッションを破棄すると、次のようになります。

<?php
    session_destroy(); // Session was halting the client from accessing another page
    fastcgi_finish_request(); 
    sleep(1000); //Simulate long computation time
?>

この解決策について考えていただけますか?

私はとは違うことをすべきですかsession_destroy()

編集:

Lachlan Peaseのコメントに続いて、私session_destroysession_write_close

4

2 に答える 2

1

問題はセッションの存在にありました。詳細については、質問の編集を参照してください

于 2012-08-01T12:28:39.283 に答える
0

私もこの問題に遭遇しました。私は register_shutdown_function によって実行する関数を登録し、関数は fastcgi_finish_request を開始しますが、 fastcgi_finish_request() の後にスクリプトがまだユーザーのページをブロックしているのを見つけました。fastcgi_finish_request() の前に; 動作し、ユーザーのページはブロックされなくなりました。

于 2015-04-10T15:24:01.877 に答える