2012-08-01 27 views
4

我有一個客戶端發送需要很長處理時間的請求,客戶端在ajax中發送請求。一旦請求被客戶端重定向到另一個網頁的服務器上接受的,這是由fastcgi_finish_request完成(我運行PHP-FPM)fastcgi_finish_request在存在開放會話時創建掛起連接

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()

編輯:

以下拉克蘭皮斯評論,我已經切換session_destroysession_write_close

+0

客戶端是否使用Internet Explorer? - 我相信它不會終止連接,除非您至少發送255個字符 - 儘管這可能只是舊版本。我不知道,我不使用它。 – Leigh 2012-08-01 11:43:48

+0

@Leigh問題是在服務器上的會話,這是在每個客戶端,請參閱編輯問題 – ekeren 2012-08-01 11:51:00

+1

@ekeren,你應該能夠使用session_write_close()來解決這個問題,而不是session_destroy() - 說,我'd仍然提出了一個關於這個PHP的錯誤,這不是完全預期的行爲 編輯:其實,想到它,這是預期的行爲 - 默認情況下,PHP會阻止,如果用戶的會話已經打開。相反,只有在後續頁面需要時纔可以嘗試打開會話;立即運行session_start()已經成爲習慣,但使用輸出緩衝可以在需要時啓動,而不會產生不良影響。 – 2012-08-01 12:05:52

回答

1

的問題是與會話存在,請參閱問題編輯爲更多詳細信息

0

我也遇到過這個問題, 我註冊了af通過register_shutdown_function, 和函數開始fastcgi_finish_request,而我發現腳本fastcgi_finish_request()仍然阻止用戶的頁面,同時把session_destroy();在fastcgi_finish_request()之前;確實有效,並且用戶的頁面不再被阻止。