2011-10-14 39 views
0

我有以下問題:PHP後臺整個瀏覽器的腳本攔截連接

PHP腳本通過Ajax調用。在未來,我想 - 腳本本身使用(在一個循環中以下行

ignore_user_abort(true); 
header("Content-Length: 0"); 
header("Connection: close"); 
flush(); 

,然後開始發送了一堆使用的PHPMailer在後臺郵件,並使用睡眠(1)每封郵件後關閉連接這是5次發送郵件後的隨機數量)。使用FireBug,我可以看到與腳本的連接被直接終止。郵件也正在發送。

但是,當腳本在後臺運行時,我無法打開任何頁面 - 它們會一直加載,直到後臺腳本明顯結束。奇怪的是:腳本似乎並未阻塞整個服務器,因爲連接限制僅適用於啓動後臺腳本的瀏覽器。因此,在我啓動腳本之後 - 比方說,FireFox,我仍然可以在Chrome中訪問服務器上的頁面。

可能是什麼原因?每個瀏覽器是否有開放的MYSQLi連接限制(每個會話,即...) - 我找不到任何東西......或者是瀏覽器(雖然FireBug說連接已經終止)爲腳本的迴應?

我怎麼能解決這個問題? 在此先感謝您的幫助。

回答

6

PHP腳本不能關閉客戶端< - >服務器連接,除非退出。做一個Connection: close頭也不會做任何事情,因爲這是客戶端 - >服務器請求,並且是默認的動作,除非客戶明確要求Connection: keep-alive

您看到的「在其他瀏覽器中工作」行爲通常是由於PHP在請求處於活動狀態時鎖定了會話文件。不同的瀏覽器不會共享cookie,因此每個瀏覽器都有自己的單獨會話。因此,儘管Firefox受此背景請求限制,Chrome正在使用的會話完全不受影響。

如果您希望在等待此郵件腳本處理時繼續使用FF,請在輸入郵件程序循環之前發出session_write_close()。這將關閉和解鎖會話文件,並讓您繼續在FF的另一個選項卡中使用該站點。

如果您希望此腳本真正獨立於瀏覽器,那麼它將不得不將pcntl_fork本身置於後臺。這個分叉的孩子可以處理處理,完全不依賴於瀏覽器,並且原始腳本可以退出,從而允許連接關閉。

+0

嗨,馬克!哇,我留下了深刻的印象 - 我不希望在不到5分鐘的時間內爲我的問題得到解釋和解決方案。 我絕對沒有考慮到會話文件鎖。非常感謝,這確實解決了問題。 – Connum