2

現在、AJAX リクエストが sendMail.php に送られています。(ヘッダーConnection: Closeを使用して) すぐに接続を閉じ、約 30 秒間処理を続けます。

しかし、私が今経験している問題は、同じクライアントがそのサーバーから PHP ページを読み込もうとすると、sendMail.php の処理が完了するまで待たなければならないことです。

これを回避する方法はありますか?

セッションに関連している可能性がある他のSOの質問を読んでいましたが、セッションを使用していないため、 sendMail.php スクリプトの開始時にsession_write_close()を呼び出してみました。

サンプルコード (これはハックでやり過ぎですが、動作します):

   //File: SendMail.php
   //error_reporting(E_ALL);
    error_reporting(0);
    session_write_close();
    set_time_limit(0); 
    ignore_user_abort(1);
    ignore_user_abort(true);
    ini_set('ignore_user_abort','1');
    apache_setenv('no-gzip', 1);
    apache_setenv('KeepAlive',0);
    ini_set('zlib.output_compression', 0);
    ini_set('output_buffering', 0);

    $size = ob_get_length();

    // send headers to tell the browser to close the connection
    header("Content-Length: $size");
    header('Connection: Close');
        // flush all output
    ignore_user_abort(true);
    ob_end_flush();
    ob_flush();
    flush();
    sleep(30);//The real code has more stuff, but just for example lets just say it sleeps for 30 seconds

参考資料の残りの部分は、GET による通常のナビゲーションです。

4

1 に答える 1

0

AJAX 呼び出しが、サーバー上の利用可能なリソース (メモリ、CPU、ディスク I/O など) を使い果たし、新しいスクリプトの実行を妨げているスクリプトを呼び出しているように思えます。ジョブを完了するのに十分なリソースが割り当てられていることを再確認してください。

余談ですが、通常、日常のユーザーがサーバー上でそれほど長時間実行されるプロセスを生成することを許可しないのは、単にシステムに負荷をかけ、DDOS 攻撃の機会を簡単に与える機会を彼らに与えるためです。可能であれば、これをcronに移動するというIbereの提案を検討します。

于 2012-10-24T19:41:29.910 に答える