2012-09-14 39 views
2

我目前有一個AJAX請求發送到sendMail.php,它立即關閉連接(使用標頭連接:關閉)並繼續處理大約30秒。通過PHP和Apache2同時連接到單個瀏覽器

但我現在遇到的問題是,當同一客戶端試圖從該服務器加載任何PHP頁面時,它必須等到sendMail.php完成處理。

有沒有辦法解決這個問題?

我正在讀一些其他SO問題,它可能是會話相關的,但我沒有使用任何會話,我甚至嘗試調用session_write_close()在sendMail.php腳本的開始。

實施例的代碼(這是哈克並經完成,但它的工作原理):

//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正常導航。

+0

AJAX是異步的(這是第一個A代表的),所以它不應該阻止瀏覽器的其他活動。 – Barmar

+0

AJAX成功完成(響應碼4,http 200 ok)。當連接強制關閉到瀏覽器時,PHP腳本會繼續,但是來自該瀏覽器的其他輸入響應(即導航到下一頁)將延遲到第一個PHP腳本(sendMail.php)停止。問題在於該特定腳本需要很長時間,並且使用AJAX和強制關閉HTTP循環訪問,但是PHP停止處理該用戶,直到初始AJAX請求實際完成爲止 – Mattisdada

+0

您可以提供一些示例代碼嗎? – shapeshifter

回答

0

這聽起來像你的AJAX調用正在調用是在服務器上嚼起來可用資源的腳本(不管是內存/ CPU /磁盤I/O的/ etc),以及阻止任何新的腳本,從能夠跑步。仔細檢查以確保您有足夠的資源分配完成工作。

在附註上,通常您不允許您的日常用戶生成在服務器上運行很長時間的進程,因爲您打開了機會讓系統過載,併爲他們提供了一個簡單的機會DDOS攻擊。如果可能的話,我會考慮Ibere的建議,即將其移至cron。