今天在本地測試一個JQuery插件,但是瀏覽器裡一直提示JQuery檔案第x行缺少「}」。
剛開始以為是js檔案有問題,所以就從官方重新下載了一個JQuery,但還是有同樣的問題,重新看了一下程式碼,沒有發現任何問題。
所以我就用火狐測試了一下,也有同樣的錯誤。於是用FireBug看了一下HTTP請求,都是200,沒問題。
但是當我查看請求jquery文件的回應結果時,發現文件是不完整的,只回傳了原始文件的一小部分。
再用迅雷從請求的地址下載這個js文件,可以下載,下載的文件大小也是對的,但是用編輯器打開後才發現,文件的末尾和原文件是不一樣的,少了一些代碼,原來請求回來的文件只是原來文件的一部分。接著我又下載了幾個比較小的文件,發現沒有問題,但稍微大一點的文件,例如100KB以上的文件,下載回來的都是不完整的。這種問題還是頭一次遇到,沒辦法,百度谷歌一起來,最後終於找到了問題的所在。原來是Apache的設定問題,解決方法如下:
只要把Apache的設定檔httpd.conf裡
如果沒有這項自己加上去:EnableSendfile Off,記得要放到上面的區塊中,不然Apache會啟動不起來。
如果不管事可以把EnableMMAP後的值也設為Off試試。
原因分析:
原來在預設情況下,當處理一個請求並不需要存取檔案內部的資料時(例如傳送一個靜態的檔案內容),如果作業系統支持,Apache將使用sendfile將檔案內容直接發送到客戶端而不讀取文件。這個sendfile機制避免了分開的讀取和寫入操作以及緩衝區分配。由於預設是開啟的,但有些作業系統對sendfile系統呼叫支援不夠。所以會出現無法傳輸大於一定容量的html頁面。關掉並不影響正常使用。
關於EnableSendfile 指令和EnableMMAP 指令
EnableSendfile 指令
說明
這個指令控制httpd是否可以使用作業系統核心的sendfile支援來將檔案傳送到客戶端。預設情況下,當處理一個請求並不需要存取檔案內部的資料時(例如發送一個靜態的檔案內容),如果作業系統支持,Apache將使用sendfile將檔案內容直接傳送到客戶端而並不讀取文件。譯者註:Linux2.4/2.6核心都支援。
這個sendfile機制避免了分開的讀和寫操作以及緩衝區分配,但是在一些平台或一些文件系統上,最好禁止這個特性來避免一些問題:
在Linux上啟用IPv6時,使用sendfile將會觸發某些網路卡上的TCP校驗和卸載bug。
當Linux運作在Itanium處理器上的時候,sendfile可能無法處理大於2GB的檔案。
對於一個透過網路掛載了NFS檔案系統的DocumentRoot (例如:NFS或SMB),核心可能無法可靠的透過自己的緩衝區服務網路檔案。
如果出現以上情況,你應當禁用sendfile :
EnableSendfile Off
針對NFS或SMB,這個指令可以被針對目錄的設定覆蓋:
EnableMMAP 指令
說明:在遞送中使用記憶體映射(memory-mapping)來讀取檔案
語法:EnableMMAP On|Off
此指令指示httpd在遞送中如果需要讀取一個檔案的內容,它是否可以使用記憶體映射。當處理一個需要存取檔案中的資料的請求時,比如說當遞送一個使用mod_include進行伺服器端分析的檔案時,如果作業系統支持,Apache會預設使用記憶體映射。
這種記憶體映射有時會帶來效能的提高,但在某些情況下,您可能會需要停用記憶體映射以避免一些作業系統的問題:
在一些多處理器的系統上,記憶體映射會減低一些httpd的性能。
在掛載了NFS的DocumentRoot上,若已經將一個檔案進行了記憶體映射,則刪除或截斷這個檔案會造成httpd因為分段故障而崩潰。
在可能遇到這些問題的伺服器設定過程中,您應使用下面的命令來停用記憶體對映:
EnableMMAP Off
對於掛載了NFS的資料夾,可以單獨指定停用記憶體對映:
以上是Apache網站下載大檔案不完整原因及解決方法的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!