2012-10-23 29 views
0

我正在構建一個web應用程序,我爲測試目的而開始應用程序的方式是從我的數據庫中將大量數據加載到會話數組中,以便我可以輕鬆使用這些值整個頁面。我有一頁上有很多選擇,每次php頁面遍歷所有變量,選擇所選的一個,並輸出下拉。我的一個數組雖然剛好低於3000個值,並且加載此下拉菜單會將頁面從大約300ms降低到1-1.2s。並不可怕,但很容易判斷它的響應性較差。所以我想知道是否有提高加載速度的方法,或者有關替代下拉的任何想法。大選擇減慢頁面加載 - 緩存php

我迄今爲止嘗試:

  1. 屆陣列存儲所有的值,當頁面通過jQuery的AJAX方法加載PHP頁面遍歷這些值和回聲的下拉菜單。

  2. PHP包括 - 創建php或html頁面的所有值預寫爲選擇,這將創建一個約100kb頁面的問題下拉列表,然後包含在include。大致相同的數額加上我不得不使用JavaScript來設置值,但我會做這個,如果它可以得到改善。我想也許有些緩存可以在這裏提供改進。包含html和php頁面似乎沒有顯着差異,但我認爲html會更好。我還假設我不能使用常規緩存,因爲我使用php函數來包含這些頁面。

  3. 我試過在html頁面中加載,第一次加載需要大約1秒,瀏覽器緩存後會回落到100-350ms,所以我想緩存可以提供巨大的性能提升。

我已經考慮:

  1. 創建整個頁面的緩存版本,但這將是非常痛苦落實所以我只能做它,如果人們認爲這是正確的方式去與此。我將不得不使用ajax來檢索一些數據,這些數據是我最初使用php回聲做的輸入。

  2. 只是刪除問題下拉菜單。

我想弄清楚的東西我從來沒有澄清,我在想PHP頁面永遠不能憑藉它的瀏覽器緩存改正,因此通過擴展包含任何PHP文件也不容。但是,如何在PHP文件中鏈接到一個JavaScript文件可以被緩存,因爲它使用的是一種html方法?

+0

無法緩存PHP代碼,但生成的HTML可以。這就是爲什麼你提到的JavaScript被緩存。 –

+0

@AdamCulp但是,從PHP產生的HTML包括緩存能夠呢? – mrmryb

+0

不是真的,因爲PHP每次都會重新渲染它,除非您有一個optcode緩存,正如我在下面的答案中所述。這可能有幫助。 –

回答

1

正在返回並解析爲下拉列表的數據可能是您的瓶頸。但是,如果瓶頸實際上是PHP代碼,那麼您可以嘗試安裝類似於APC的optcode緩存http://php.net/manual/en/book.apc.php。它會加快你的PHP。 (Zend Optimizer也可從以下網址獲得:http://www.zend.com/en/products/guard/runtime-decoders

如果您的瓶頸是下拉菜單中的項目來自的數據庫,則可能需要嘗試設置MySQL以緩存結果。

您可能還想嘗試使用AJAX在用戶向下滾動時填充下拉列表的替代下拉列表,一次只顯示幾條記錄。您也可以將其創建爲文本字段,以便在用戶輸入時提示可能的匹配。這些東西可能會更快。

+0

謝謝,我喜歡帶自動完成類型函數的文本字段的建議,但沒有考慮到這一點。我試圖圍繞PHP緩存和瀏覽器緩存之間的區別。瀏覽器緩存通過存儲文件的本地副本來工作,以便可以快速檢索它,php緩存實際上做了什麼來提高性能? – mrmryb

+1

PHP緩存實際上是optcode緩存。它的工作方式是在運行創建輸出之前,PHP首先恢復爲原始optcode。每次PHP運行時,都會經歷相同的步驟。通過緩存optcode,它跳過了恢復原始optcode的步驟,並節省了時間。 –

+2

@mrmryb:您可以閱讀更多關於php操作碼緩存的信息[此處](http://en.wikipedia.org/wiki/PHP_accelerator),但在這種情況下,PHP編譯/執行不太可能是瓶頸。 – grossvogel

1

我懷疑問題在於你傳送的數據的原始大小,這是基於「迄今爲止我嘗試過的內容」中的數字2的結果。我不認爲你可以依靠瀏覽器緩存,而服務器端緩存不會改變傳輸數據的大小。

這裏有一對夫婦的想法,以減少網頁加載過程中傳輸的數據量:

  1. 負載選擇框分開,主要的頁面已經 交付後,使用異步JavaScript調用。
  2. 將選擇分爲一系列等級選擇。用戶 選擇頂級類別,然後使用匹配的子類別填充另一個選擇框 。當他們選擇一個子類別時, 第三個框會填入該子類別中的實際選項。類似於 this。 當然,這僅適用於使用異步 JavaScript調用填充第2個和第3個控件。

無論哪種方式,請確保您的服務器上啓用了gzip壓縮。

編輯:更多關於瀏覽器緩存
瀏覽器緩存單獨的文件,你通常不會問它緩存PHP頁面,因爲它們可能會有所不同在下一次。 (個別的PHP包括瀏覽器是不可見的,因爲PHP將它們的內容組合到HTML流中。)如果您使用瀏覽器的開發者控制檯(例如,在Chrome上點擊f12並轉到網絡),您可以看到大多數頁面會導致多個頁面請求從瀏覽器到服務器,您甚至可能會看到其中一些文件(js,css,圖像)來自緩存。

瀏覽器緩存的內容和多長時間受各種HTTP響應頭控制,如Cache-ControlExpires。如果您不通過調用header函數在php中覆蓋這些函數,則它們由Web服務器(Apache)配置進行控制。