作者 主題: AJAX 是否支援 gzip?  (閱讀 5717 次)

0 會員 與 1 訪客 正在閱讀本文。

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
AJAX 是否支援 gzip?
« 於: 2009-10-10 17:01 »
今天爬了一天的估狗, 也做了測試
多數文章都說只要ajax送出下面資料就可以

Accept-Encoding: gzip, deflate

不過我試了好久
瀏覽器環境是 ubuntu 9.04(x64) + firefox 3.0.14
如果主機送出..

代碼: [選擇]
header("Content-encoding: gzip");
ajax(jQuery)完全沒反應
如果不送出上面的 header
則可以收到資料, 不過是亂碼
應該是未解壓縮的 gzip 資料

後來在 vista + ie7 試了一下
也是一樣的結果..

所以,
到底 ajax 有沒有支援 gzip 資料解壓縮啊  ???

TyroneYeh

  • 俺是博士!
  • *****
  • 文章數: 2396
  • 性別: 男
    • 檢視個人資料
回覆: AJAX 是否支援 gzip?
« 回覆 #1 於: 2009-10-10 18:07 »
apache 有掛 deflate 模組就不用 php 在壓一次吧! 這樣不見得比較快
正常瀏覽器都會自動解開 gzip 壓縮
看 deflate log 就知道 ajax 的要求有沒有處理不是嗎?
我覺得要從資料下手吧,例如 資料回傳越簡單精簡越好

把原本的 json 格式改成 array 回傳,好像就有加快傳輸速度(有些程式當然也有調整)

例如原來的 JSON 資料是:
[{'name': 'TYRONEYEH', 'tel': '0987654321', 'addr': 'No.8 hyper road, hsinchu'}]

改成 Array 的格式變:
[['TYRONEYEH', '0987654321', 'No.8 hyper road, hsinchu']]

這樣就少了 column 的定義,如果是 xml
代碼: [選擇]
<roor>
  <rows>
    <name>TYRONEYEH</name>
    <tel>0987654321</tel>
    <addr>No.8 hyper road, hsinchu</addr>
  <rows>
</root>
看起來是不是更大了

後端的資料用
代碼: [選擇]
<?php
if ($rs){
  
$result "[";
  
$rscount count($rs);
  for (
$i 0$i $rscount$i++)
    
$result .= "[&#39;"implode("&#39;,&#39;"array_values($rs[$i])) ."&#39;],";
  return 
substr($result0, -1) ."]";
//if
?>


ajax 接回來的 responseText 用 var v = eval(o.responseText);
這樣 v 就是 javascript 的陣列啦!

資料越大大小就差越多!個人觀點僅供參考....^_^"
--
TyroneYeh

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: AJAX 是否支援 gzip?
« 回覆 #2 於: 2009-10-10 19:23 »
apache 有掛 deflate 模組就不用 php 在壓一次吧! 這樣不見得比較快

用 php 壓的目的是要將動態壓縮變成靜態壓縮
因為網站會建立一些動態設定的JS碼
這些JS碼雖然是動態建立(存入DB or file)
不過卻不是每次瀏覽都需要重新建立一次
所以這些JS碼多數時間都會是靜態的
如果改用 php 先壓縮的話
可以省下 CPU 的負載~

我有觀察 deflate 的 log 記錄(感謝提醒看log ^^)
apache 確實是有傳回壓縮過的資料給 ajax

代碼: [選擇]
"GET /ajax/mypageServer.php?fn=0&_=1255172607088 HTTP/1.1" 1679/4569 (36%)
但是很奇怪, 我用 php 壓縮傳回卻不成功  :-\

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: AJAX 是否支援 gzip?
« 回覆 #3 於: 2009-10-11 09:02 »
做了多次測試並觀察log檔發現~

如果 php 在送出 gzip 資料前不送出:
代碼: [選擇]
Content-encoding: gzip
deflate 會再壓縮一次
所以 ajax 應該是有解壓縮
只是因為deflate多壓縮了一次
ajax解壓後的資料還是 gzip

如果 php 送出 gzip 的 header
deflate 雖然不會再多壓縮一次
不過 ajax 卻不會解壓縮(?)
(或是其他問題, 因為ajax完全沒有回應)

但是同一支 server 端的 php 程式碼
用在一般的 get 請求卻是完全正常的~

TyroneYeh

  • 俺是博士!
  • *****
  • 文章數: 2396
  • 性別: 男
    • 檢視個人資料
回覆: AJAX 是否支援 gzip?
« 回覆 #4 於: 2009-10-11 09:14 »
解壓是 瀏覽器的工作啊!!
用 javascript 解不會比較快吧。。。

現在網絡不會慢... 用 apache 的功能就好了啊
用程式做這段可能不符合效益吧!!

Client 的負載也要考慮吧
--
TyroneYeh

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: AJAX 是否支援 gzip?
« 回覆 #5 於: 2009-10-11 09:31 »
解壓是 瀏覽器的工作啊!!
用 javascript 解不會比較快吧。。。

現在網絡不會慢... 用 apache 的功能就好了啊
用程式做這段可能不符合效益吧!!

Client 的負載也要考慮吧

T老大, 您完全誤解我的原意了orz~~
我所謂的ajax解壓縮是指瀏覽器端用ajax抓資料回來時瀏覽器解壓縮
從頭到尾我都沒說是用 javascript 來解壓縮 = ="

==
我當然知道用 apache deflate 就可以, 前面已經說過
我是要將

多數時間都是靜態的資料預先用 php 壓縮起來

但是這些資料卻是動態建立的..
不管怎樣~ 當連線數多時
deflate的工作也是會越來越吃重
如果先將資料壓縮起來
不用每次連線都要壓縮一次
只有當資料有更新時才需要重新壓縮
對主機來說, 也是會減輕不少負擔~

TyroneYeh

  • 俺是博士!
  • *****
  • 文章數: 2396
  • 性別: 男
    • 檢視個人資料
回覆: AJAX 是否支援 gzip?
« 回覆 #6 於: 2009-10-11 10:27 »
這樣不就是 apache deflate + cache 的 module 啊
不用自己在 cache 一次吧

像用 smarty 的 cache...
把 check 是否有修改的速度比不檢查還慢

所以用 php 來做這些事是比較慢的!

建議在 apache 端來做比較快...

就像 php+gzip 比 apache+deflate 的效能來看...
--
TyroneYeh