2013-04-13 131 views
3

我爲一位朋友創建了一個網站。因爲他希望音樂播放器能夠通過頁面加載繼續播放音樂,所以我決定通過ajax(由jQuery提供便利)將內容加載到頁面中。它工作的很好,當沒有javascript時它會很好地回退,並且後退/前進按鈕工作得很好,但在服務器上速度非常慢。爲什麼我的Ajax請求比一般的瀏覽器請求慢得多?

有幾點:

  1. 初始頁面加載是相當快的。 Chrome開發者控制檯告訴我,「index.php」在大約2.5秒內加載。我已經設置了查詢字符串參數來指定加載哪個頁面,並且這個時間框架對於他們來說大致是準確的。對於主頁,加載了8.4KB的數據。

  2. 當我通過ajax請求加載內容時,無論下載的數據大小如何,大約需要20秒。以這種方式加載的最小數據量大約爲500個字節。這裏顯然存在不匹配。

因此,Chrome告訴我,絕大多數時間都是「等待」,我認爲服務器正在處理請求。所以,這隻能意味着,我的代碼要麼花了很長時間,要麼就是服務器上出現了一些棘手的問題。我不認爲這是我的代碼,因爲它是相當小:

$file = ""; 
if (isset($_GET['page'])) { 
    $file = $_GET['page']; 
} else if (isset($_POST['page'])) { 
    $file = $_POST['page']; 
} else { 
    $file = "home"; 
} 

$file = 'content/' . $file . '.php'; 

if (file_exists($file)) { 
    include_once($file); 
} else { 
    include_once('content/404.php'); 
} 

這是一個content_loader.php文件,我的JavaScript(在這種情況下)發送GET請求與「頁」參數一起。 HTML標記被返回並放入頁面上的DIV中。

我正在使用jQuery .get()速記功能,所以我不認爲我可能會搞砸那裏的任何東西,而且我相信它不是Javascript問題,因爲延遲是在等待來自服務器的數據。再次,即使數據非常小,大約需要20秒。

我目前認爲這是服務器的問題,但我不明白爲什麼通過JavaScript做出的請求比通過瀏覽器傳統方式做出的請求慢得多。作爲補充說明,一些內容頁面連接到MySQL數據庫,但有些則不。它似乎並不關乎頁面處理的內容或它包含的數據量,它需要20秒左右的時間。

我很茫然......有誰知道任何可能解釋這一點的東西?另外,我很抱歉,如果這不是這樣一個問題的正確位置,其他場所也不是特別適合這個問題。

+0

基於我過去處理的類似問題,我立即想到了幾件事情。首先可能是反向DNS查詢問題。在反向DNS查找失敗後,它可能會超時。其他問題:你在使用MySQL嗎?你正在加載一個基於文件的會話嗎? –

+0

建立了一個MySQL連接,儘管一些內容頁面根本不使用它。另外,我根本不使用會話。我想到了嘗試和執行我的PHP的時間,所以我非常簡單地在發生任何事情之前(包括與數據庫的連接)回覆出時間(),並且在所有事情完成之前,在它被髮送之前回到客戶端。輸出是相同的,所以我認爲這意味着我的腳本運行時間不到一秒。你能詳細談談反向DNS問題嗎?我不確定你在做什麼。 – user2276673

+0

請參閱下面的答案。我剛加了一點解釋。 –

回答

0

正如我在我的評論中提到的,一個確定的可能性可能是反向DNS查找。我之前遇到過這個問題,我敢打賭這是你緩慢請求的來源。在常規的apache和vhost配置以及.htaccess中都需要注意某些Apache配置指令。這裏有一些鏈接,應該有希望幫助:

http://www.tablix.org/~avian/blog/archives/2011/04/reverse_dns_lookups_and_apache/

http://betabug.ch/blogs/ch-athens/933

爲了找到更多的資源只是谷歌像「阿帕奇慢反向DNS」。

一個很小的解釋

在DNS反向查詢,試圖解析IP地址,主機名。大多數情況下,像Apache,SSH和MySQL這樣的服務是不必要的,這是一個壞主意,因爲它只會減慢請求/連接。查找不同服務的配置設置並禁用反向DNS查找(如果不需要)很好。

在Apache中有某些配置設置會導致發生反向查找。諸如HostnameLookups之類,並允許/拒絕指定域名而不是IP地址的規則。有關更多信息,請參閱上面的鏈接。

正如您在評論中所建議的那樣,PHP腳本一旦運行就會很快執行。花在Apache上的時間是等待 - 最有可能做一個反向DNS查找,並失敗。您知道問題不在您的代碼中,而是與請求中涉及的其他服務一起使用。

希望這會有所幫助!

+0

我的理解是,如果正在進行反向DNS查找,那麼apache訪問日誌將顯示主機名,而不僅僅是IP地址,是正確的?在我的情況下,日誌只顯示一個IP地址。 – user2276673

+0

這取決於它試圖查找的內容。你可能已經關閉了HostnameLookups,但是其他地方的一個不同的規則試圖去做。或者,它可能會在反向查找時失敗,只會將IP粘在日誌中。嘗試對日誌中的最近IP進行反向查找:http://remote.12dt.com/ - 還要注意訪問日誌中的GET請求的時間戳與實際發出請求的時間,請參閱它給你的時間戳。 –

+0

反向查找正常。我測試了它的IP地址(它顯示在日誌中),並解析爲明智的主機名。另一件我不明白的事情是,它每次大約需要20秒,就好像服務器由於某種原因阻塞了一段時間...... – user2276673