2012-06-16 241 views
1

我有一個PHP應用程序,我一直有一些問題,有些頁面需要很長時間才能加載。PHP連接:關閉

幾個小時後,我已經找到了問題,但我不知道如何解決它。

問題似乎與標題Connection: keep-alive。我使用了一個名爲「篡改數據」的Firefox插件,它允許您「篡改」標題和內容。一旦我使用該工具將連接標題更改爲Connection: close,則某些頁面上的延遲將停止。

在PHP中,如何確保使用Connection: close標題?

我試着把header("Connection: close");放在PHP文件的頂部,然後重新加載頁面。它仍然發送Connection: keep-alive標題,而不是我試圖發送的標題。

我該如何實現我想要做的?

編輯:我剛剛意識到,在這個子域上,內容長度標題根本不會在大多數頁面上發送。它只是在表單提交之後立即發送,然後是重定向。

編輯2:

這是網頁:http://volunteer.essentialtransit.com/job/13/just-a-test-at-eta/

點擊「立即申請」鏈接,並填寫一些隨機的txt,你並不需要附加文件。注意,當您重定向回「作業」詳細信息頁面時,需要很長時間才能加載。

+0

你使用什麼服務器?除非在極少數情況下,這與PHP沒有任何關係。 – Brad

+0

Apache。但是,我在共享主機上,因此無法修改Apache配置文件。 –

+0

確保使用反引號(')來代替單引號或雙引號。 –

回答

1

因此,我確定了問題所在,並找到了解決此問題的方法。

處理表單的腳本只是處理輸入並重定向到另一個頁面,但實際上並未輸出任何內容。在網站上的大多數頁面上,內容長度標題不是被髮送,就是被設置爲正確的值。但由於某種原因,當發佈到一個頁面,然後重定向沒有處理腳本輸出任何東西到瀏覽器,內容長度被設置爲0.

我試着設置內容長度我自己,但沒有有很多運氣,因爲它似乎沒有什麼區別。

所以,我所做的只是讓處理腳本有一些輸出。所以現在當表單被提交時,處理腳本輸出一個帶有重定向腳本的頁面(以及一個'點擊以繼續'的消息以防萬一),這會導致正確的頁面。因此,雖然這會在表單提交和正確頁面之間增加一個非常短暫的延遲,但會導致正確設置內容長度並解決問題。

雖然這不是一個理想的解決方案,但它是可管理的,並使腳本工作。

2

你的問題與連接狀態無關。它可能看起來與連接有關,因爲Apache自動爲每個源自不同源的新請求生成一個新的子線程。保持活動狀態時,它將嘗試重用以前的線程,該線程來自PHP腳本(來自應用程序)的忙碌事件。實際上它有點複雜,但這是最基本的。請注意,正在發送「連接:關閉」,但只有在腳本完成後纔會關閉連接(將所有緩衝區發送出去)。

現在我要告訴你如何調試你的腳本。我會這樣做,因爲如果你沒有解決你的問題,並獲得更多的流量,你的主機會將你踢出極端的資源使用。

所以:

  1. 追加set_time_limit(5)或更高,以確認有一個後臺腳本問題
  2. 檢查要求對本地資源的請求,這隻會暫存服務器上運行(您可以使用Wireshark這個)
  3. 檢查外部請求,捲曲,file_get_contents()電話,任何與超時
  4. 基準和優化冗長的腳本(你可以試試Xdebug的這個)
  5. 將所有PHP通知,警告和錯誤記錄到文件中;你應該得到最多零錯誤
  6. 最後,這是一個很好的做法,三重檢查你的整個應用程序。一個用於數據輸入,另一個用於數據操作,第三個用於模塊互連。但是您應該關注無法返回輸出的AJAX後臺腳本

當然,跳過任何不適用的東西。

+0

在我嘗試那些可能適用的方法之前,我想確保我解釋正確。當輸入地址時,或者當您按照指向的鏈接時,頁面會正常加載。該問題僅發生在頁面上的表單提交後,然後用戶重定向回頁面。該頁面包含志願者機會的詳細信息並有申請表。該表單被提交給處理腳本,然後處理腳本將您重定向到您所在的同一頁面。 –

+0

在這兩種情況下,腳本都以完全相同的方式訪問,唯一的區別是我可以找到的是包含內容長度標題,並在重定向後設置爲0。 唯一不同的是,有一個會話變量集表示人們提交了一個應用程序,它允許顯示「成功」消息。如果這是由後臺腳本引起的,那麼直接訪問同一頁面時不會出現同樣的問題嗎? –

+0

這是該頁面:http://volunteer.essentialtransit.com/job/13/just-a-test-at-eta/ 點擊「立即申請」鏈接並填寫一些隨機的txt文件,你不需要需要附加一個文件。注意,當您重定向回「作業」詳細信息頁面時,需要很長時間才能加載。 –