SlideShare uma empresa Scribd logo
1 de 36
HTTP Caching in PHP
hunter@rakuya.com.tw
Nov. 2008
F5 和 Ctrl-F5 的差別?
Table of Contents
• HTTP Overview
• Rakuya JS Loader
HTTP Overview
A GET Request
GET /index.php HTTP/1.1
Host: www.rakuya.com.tw
User-Agent:Mozilla/4.0 (...)
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 355
<html>...
Last-Modified Header
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 355
Last-Modified: Thu, 27 Nov 2008 17:27:48 GMT
<html>...
Last Modified – Request
• Conditional Request
 由 Server 端再判斷一次是否要更新內容
GET /index.php HTTP/1.1
Host: www.rakuya.com.tw
User-Agent:Mozilla/4.0 (...)
If-Modified-Since: Thu, 27 Nov 2008 17:27:48 GMT
HTTP/1.1 304 Not Modified
Content-Type: text/html
Content-Length: 0
Last-Modified: Thu, 27 Nov 2008 17:27:48 GMT
Last Modified - Ctrl-F5
• 清除掉 If-Modified-Since
 當成新的 request
GET /index.php HTTP/1.1
Host: www.rakuya.com.tw
User-Agent:Mozilla/4.0 (...)
If-Modified-Since: Thu, 27 Nov 2008 17:27:48 GMT
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 355
<html>...
Expires Header
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 355
Expires: Wed, 31 Dec 2008 23:59:59 GMT
<html>...
Expires - Before Refresh
• Cached
Expires - Refresh(F5)
• New Request
DEMO
正解
• F5 和 Ctrl-F5
 都是重新向 server 發出 request
• F5
 解除 Expires 造成的 local 端的 cache
• Ctrl-F5
 清除 Last-Modified (或 ETag) 造成的
conditional request
但是要小心
不是每個瀏覽器的實做方式都一樣
幸好
F5 和 Ctrl-F5 在 Firefox 作用相似
不幸的是
Google Chrome 實做方式不一樣
F5 和 Ctrl-F5 分不太出來差別...
補充一點
ETag Header
• 與 Last-Modifed 相似,但不限於使用日期,
常見的使用方式是給檔案的 MD5
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 355
Etag: fc5e038d38a57032085441e7fe7010b0
<html>...
ETag Header - Request
• Conditional Request
 一樣由 Server 端判斷是否要更新內容
GET /index.php HTTP/1.1
Host: www.rakuya.com.tw
User-Agent:Mozilla/4.0 (...)
If-None-Match: fc5e038d38a57032085441e7fe7010b0
HTTP/1.1 304 Not Modified
Content-Type: text/html
Content-Length: 0
Etag: fc5e038d38a57032085441e7fe7010b0
ETag Header - Ctrl-F5
• 清除 If-None-Matched
 當成新的 request
GET /index.php HTTP/1.1
Host: www.rakuya.com.tw
User-Agent:Mozilla/4.0 (...)
If-None-Match: fc5e038d38a57032085441e7fe7010b0
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 355
<html>...
Rakuya JS Loader
Objective
• 使用 php 實做
• 多檔合併 (第一次 Request 速度加快)
• Cache (減少 Request)
• Conditional Request (第二次 Request 時速
度加快)
• 任一檔案被修改時能即時送出正確的結果
• pack (減少檔案大小)
Flow
• 送出 Expires Header
• 判斷並處理 If-Modified-Since
 若無更新,則送出 HTTP 304
• 讀取並處理所有檔案 (Disk IO)
• 判斷並處理 If-None-Match
 若無更新,則送出 HTTP 304
• 完整 Output
Usage
• loader.php?a.js&b.js&c.js&...
 透過 ETag 來處理檔案的 md5,檔案一更新,
就會立即更新
 Ex: http://www.rakuya.com.tw/js/loader.php?json2.pack.js&jquery-
1.2.6.pack.js&jquery.blockUI.pack.js&jquery.mousewheel.pack.js&jquery.scrollTo-
min.js&ui.core.pack.js&ui.slider.pack.js&item.js&fl.js&ad.js&map_libs_stable/mapstation.js&
map_libs_stable/RA_hintwindow.js&map_libs_stable/RA_infowindow_2.js&map_libs_stable/
RakuyaMapExt.js&RAKUYA.js&RAKUYA.search.js&RAKUYA.searchHistory.js&jquery.autoc
omplete.pack.js&RAKUYA.data.cityarea.js&jquery.scrollbox.js&RAKUYA.excel.menu.js
PHP:
header('Etag: '. md5($file_contents));
Options
• &ver=20081105
• &ver=20081105112233
 透過 Last-Modifed 產生 Conditional Request,
可減少 Disk IO
PHP:
header('Last-Modified: '. gmdate(DATE_RFC1123));
Options - cont.
• &opt=packall
 全部檔案一起做 pack (事實上我也沒用過)
• &opt=plaintext
 不做壓縮,方便除錯
建議使用方式
• DEV 開發時
 把 js 加到 loader 的白名單內 (pack用)
 先不使用 &ver= 的參數
• 正式機上
 加上 &ver= 的參數,減少 Disk IO
請注意
每個 statement 都要加上 ;
var foo = 1;
var bar = function() {
alert(foo);
};
function bar2() {
bar();
}
TODO
• Remove BOM From UTF-8
• Minify Option
• Server-Side File Caching
• URL Rewrite
• Gzip Encoding
• CSS Loader Enhancement
Frond-End 的成果 (首頁)
Achieved
• Rule 1: Make Fewer HTTP Requests
• Rule 3: Add an Expires Header
• Rule 5: Put Stylesheets at the Top
• Rule 6: Put Scripts at the Bottom
• Rule 7: Avoid CSS Expressions
• Rule 8: Make JavaScript and CSS External
• Rule 10: Minify JavaScript
• Rule 13: Configure ETags
Further Study
Recommended Links
• Exceptional Performance (YDN)
http://developer.yahoo.com/performance/
• Combine - Another JS/CSS Loader
http://rakaz.nl/extra/code/combine
Any Questions?
好康分享

Mais conteúdo relacionado

Mais procurados

The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021StreamNative
 
Using armeria to write your RPC
Using armeria to write your RPCUsing armeria to write your RPC
Using armeria to write your RPCkoji lin
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at TaobaoJoshua Zhu
 
Leveldb background
Leveldb backgroundLeveldb background
Leveldb background宗志 陈
 
Improvements Made in KoP 2.9.0 - Pulsar Summit Asia 2021
Improvements Made in KoP 2.9.0  - Pulsar Summit Asia 2021Improvements Made in KoP 2.9.0  - Pulsar Summit Asia 2021
Improvements Made in KoP 2.9.0 - Pulsar Summit Asia 2021StreamNative
 
Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)振揚 陳
 
Fiddler for chrom extension
Fiddler for chrom extensionFiddler for chrom extension
Fiddler for chrom extensionWelefen Lee
 
分布式文件系统概况及FastDFS介绍
分布式文件系统概况及FastDFS介绍分布式文件系统概况及FastDFS介绍
分布式文件系统概况及FastDFS介绍billowqiu
 
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao ZhangBuilding the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao ZhangCeph Community
 
Caching in HTTP
Caching in HTTPCaching in HTTP
Caching in HTTP家弘 周
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops琛琳 饶
 
分布式文件系统FastDFS架构剖析
分布式文件系统FastDFS架构剖析分布式文件系统FastDFS架构剖析
分布式文件系统FastDFS架构剖析billowqiu
 
gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務升煌 黃
 
Share http2
Share   http2Share   http2
Share http2garyxu17
 
深入浅出Netty l.t
深入浅出Netty   l.t深入浅出Netty   l.t
深入浅出Netty l.toleone
 
QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战dennis zhuang
 
易度云查看 - 产品介绍
易度云查看 - 产品介绍易度云查看 - 产品介绍
易度云查看 - 产品介绍changxing qi
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈Tim Y
 

Mais procurados (20)

The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
The Evolution History of RoP(RocketMQ-on-Pulsar) - Pulsar Summit Asia 2021
 
Using armeria to write your RPC
Using armeria to write your RPCUsing armeria to write your RPC
Using armeria to write your RPC
 
Hacking Nginx at Taobao
Hacking Nginx at TaobaoHacking Nginx at Taobao
Hacking Nginx at Taobao
 
Leveldb background
Leveldb backgroundLeveldb background
Leveldb background
 
Improvements Made in KoP 2.9.0 - Pulsar Summit Asia 2021
Improvements Made in KoP 2.9.0  - Pulsar Summit Asia 2021Improvements Made in KoP 2.9.0  - Pulsar Summit Asia 2021
Improvements Made in KoP 2.9.0 - Pulsar Summit Asia 2021
 
Level db
Level dbLevel db
Level db
 
Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)Http Headers 與 Cache 機制(2016)
Http Headers 與 Cache 機制(2016)
 
Fiddler for chrom extension
Fiddler for chrom extensionFiddler for chrom extension
Fiddler for chrom extension
 
Mesos intro
Mesos introMesos intro
Mesos intro
 
分布式文件系统概况及FastDFS介绍
分布式文件系统概况及FastDFS介绍分布式文件系统概况及FastDFS介绍
分布式文件系统概况及FastDFS介绍
 
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao ZhangBuilding the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
 
Caching in HTTP
Caching in HTTPCaching in HTTP
Caching in HTTP
 
Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops
 
分布式文件系统FastDFS架构剖析
分布式文件系统FastDFS架构剖析分布式文件系统FastDFS架构剖析
分布式文件系统FastDFS架构剖析
 
gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務gRPC - 打造輕量、高效能的後端服務
gRPC - 打造輕量、高效能的後端服務
 
Share http2
Share   http2Share   http2
Share http2
 
深入浅出Netty l.t
深入浅出Netty   l.t深入浅出Netty   l.t
深入浅出Netty l.t
 
QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战
 
易度云查看 - 产品介绍
易度云查看 - 产品介绍易度云查看 - 产品介绍
易度云查看 - 产品介绍
 
分布式Key Value Store漫谈
分布式Key Value Store漫谈分布式Key Value Store漫谈
分布式Key Value Store漫谈
 

Destaque

Dengue - controle de pragas
Dengue - controle de pragasDengue - controle de pragas
Dengue - controle de pragasadrianomedico
 
Vy 32 inovace11_3_647 pálená hmota- vaječné věnečky
Vy 32 inovace11_3_647 pálená hmota- vaječné věnečkyVy 32 inovace11_3_647 pálená hmota- vaječné věnečky
Vy 32 inovace11_3_647 pálená hmota- vaječné věnečkyokoun
 
Business intelligence
Business intelligenceBusiness intelligence
Business intelligenceSonali Pandey
 
Bim brochure updated
Bim brochure   updatedBim brochure   updated
Bim brochure updatedcompanion_9
 
Instalasi Adempiere bahan ajar
Instalasi Adempiere bahan ajarInstalasi Adempiere bahan ajar
Instalasi Adempiere bahan ajarhariesa
 
Tabakoa igarki mikel
Tabakoa igarki mikelTabakoa igarki mikel
Tabakoa igarki mikelOGTOGT
 
Ict for presentation group 3
Ict for presentation group 3Ict for presentation group 3
Ict for presentation group 3miftahsaleh
 
2013 tf state_schedule5
2013 tf state_schedule52013 tf state_schedule5
2013 tf state_schedule5purebader
 
Café Bajo Sombra Puerto Rico
Café Bajo Sombra Puerto RicoCafé Bajo Sombra Puerto Rico
Café Bajo Sombra Puerto RicoCafiesencia
 
ФК "Анжи": анализ тактики (март 2013)
ФК "Анжи": анализ тактики (март 2013)ФК "Анжи": анализ тактики (март 2013)
ФК "Анжи": анализ тактики (март 2013)Peter Chulkov
 
Session 9 10,-store_location
Session 9 10,-store_locationSession 9 10,-store_location
Session 9 10,-store_locationswastika_p
 
Introduction.to.j query
Introduction.to.j queryIntroduction.to.j query
Introduction.to.j queryHunter Wu
 
20091211 google chrome_developer_tools
20091211 google chrome_developer_tools20091211 google chrome_developer_tools
20091211 google chrome_developer_toolsHunter Wu
 
ICTs Why and What?
ICTs Why and What?ICTs Why and What?
ICTs Why and What?Violin91
 
социально обеспечительные правоотношения
социально обеспечительные правоотношениясоциально обеспечительные правоотношения
социально обеспечительные правоотношенияshapishek
 

Destaque (20)

Dengue - controle de pragas
Dengue - controle de pragasDengue - controle de pragas
Dengue - controle de pragas
 
Vy 32 inovace11_3_647 pálená hmota- vaječné věnečky
Vy 32 inovace11_3_647 pálená hmota- vaječné věnečkyVy 32 inovace11_3_647 pálená hmota- vaječné věnečky
Vy 32 inovace11_3_647 pálená hmota- vaječné věnečky
 
Lombricultura presentacion para alumnos de 6 b
Lombricultura presentacion para alumnos de 6 bLombricultura presentacion para alumnos de 6 b
Lombricultura presentacion para alumnos de 6 b
 
Business intelligence
Business intelligenceBusiness intelligence
Business intelligence
 
Bim brochure updated
Bim brochure   updatedBim brochure   updated
Bim brochure updated
 
Instalasi Adempiere bahan ajar
Instalasi Adempiere bahan ajarInstalasi Adempiere bahan ajar
Instalasi Adempiere bahan ajar
 
Tabakoa igarki mikel
Tabakoa igarki mikelTabakoa igarki mikel
Tabakoa igarki mikel
 
Ict for presentation group 3
Ict for presentation group 3Ict for presentation group 3
Ict for presentation group 3
 
2013 tf state_schedule5
2013 tf state_schedule52013 tf state_schedule5
2013 tf state_schedule5
 
Café Bajo Sombra Puerto Rico
Café Bajo Sombra Puerto RicoCafé Bajo Sombra Puerto Rico
Café Bajo Sombra Puerto Rico
 
ФК "Анжи": анализ тактики (март 2013)
ФК "Анжи": анализ тактики (март 2013)ФК "Анжи": анализ тактики (март 2013)
ФК "Анжи": анализ тактики (март 2013)
 
Metodos de integracion
Metodos de integracionMetodos de integracion
Metodos de integracion
 
Session 9 10,-store_location
Session 9 10,-store_locationSession 9 10,-store_location
Session 9 10,-store_location
 
Introduction.to.j query
Introduction.to.j queryIntroduction.to.j query
Introduction.to.j query
 
20091211 google chrome_developer_tools
20091211 google chrome_developer_tools20091211 google chrome_developer_tools
20091211 google chrome_developer_tools
 
Rihlah
RihlahRihlah
Rihlah
 
E learning course
E learning courseE learning course
E learning course
 
παρουσίαση2
παρουσίαση2παρουσίαση2
παρουσίαση2
 
ICTs Why and What?
ICTs Why and What?ICTs Why and What?
ICTs Why and What?
 
социально обеспечительные правоотношения
социально обеспечительные правоотношениясоциально обеспечительные правоотношения
социально обеспечительные правоотношения
 

Semelhante a 20081128 http caching_in_php

20111018 zhouchen share
20111018 zhouchen share20111018 zhouchen share
20111018 zhouchen sharezcbug
 
Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5lovingprince58
 
初學者都該了解的 HTTP 通訊協定基礎
初學者都該了解的 HTTP 通訊協定基礎初學者都該了解的 HTTP 通訊協定基礎
初學者都該了解的 HTTP 通訊協定基礎Will Huang
 
Http cache 的優化
Http cache 的優化Http cache 的優化
Http cache 的優化振揚 陳
 
Pptv lb日志实时分析平台
Pptv lb日志实时分析平台Pptv lb日志实时分析平台
Pptv lb日志实时分析平台drewz lin
 
前端调试工具,编码相关,性能相关
前端调试工具,编码相关,性能相关前端调试工具,编码相关,性能相关
前端调试工具,编码相关,性能相关jay li
 
前端性能优化&测试
前端性能优化&测试前端性能优化&测试
前端性能优化&测试tbmallf2e
 
COSCUP 2010 - node.JS 於互動式網站之應用
COSCUP 2010 - node.JS 於互動式網站之應用COSCUP 2010 - node.JS 於互動式網站之應用
COSCUP 2010 - node.JS 於互動式網站之應用ericpi Bi
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Wen-Tien Chang
 
WEB 安全基础
WEB 安全基础WEB 安全基础
WEB 安全基础xki
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
OpenWebSchool - 01 - WWW Intro
OpenWebSchool - 01 - WWW IntroOpenWebSchool - 01 - WWW Intro
OpenWebSchool - 01 - WWW IntroHung-yu Lin
 
ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享國昭 張
 
introduce Okhttp
introduce Okhttpintroduce Okhttp
introduce Okhttp朋 王
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送yongboy
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送yongboy
 
高性能存储引擎TokuDB剖析
高性能存储引擎TokuDB剖析高性能存储引擎TokuDB剖析
高性能存储引擎TokuDB剖析Bohu TANG
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
 

Semelhante a 20081128 http caching_in_php (20)

20111018 zhouchen share
20111018 zhouchen share20111018 zhouchen share
20111018 zhouchen share
 
Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5Jetty服务器架构及调优.v2 2011-5
Jetty服务器架构及调优.v2 2011-5
 
初學者都該了解的 HTTP 通訊協定基礎
初學者都該了解的 HTTP 通訊協定基礎初學者都該了解的 HTTP 通訊協定基礎
初學者都該了解的 HTTP 通訊協定基礎
 
Http cache 的優化
Http cache 的優化Http cache 的優化
Http cache 的優化
 
Pptv lb日志实时分析平台
Pptv lb日志实时分析平台Pptv lb日志实时分析平台
Pptv lb日志实时分析平台
 
前端调试工具,编码相关,性能相关
前端调试工具,编码相关,性能相关前端调试工具,编码相关,性能相关
前端调试工具,编码相关,性能相关
 
前端性能优化&测试
前端性能优化&测试前端性能优化&测试
前端性能优化&测试
 
COSCUP 2010 - node.JS 於互動式網站之應用
COSCUP 2010 - node.JS 於互動式網站之應用COSCUP 2010 - node.JS 於互動式網站之應用
COSCUP 2010 - node.JS 於互動式網站之應用
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀
 
WEB 安全基础
WEB 安全基础WEB 安全基础
WEB 安全基础
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
OpenWebSchool - 01 - WWW Intro
OpenWebSchool - 01 - WWW IntroOpenWebSchool - 01 - WWW Intro
OpenWebSchool - 01 - WWW Intro
 
ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享ASP.Net WebAPI經驗分享
ASP.Net WebAPI經驗分享
 
Html5
Html5Html5
Html5
 
introduce Okhttp
introduce Okhttpintroduce Okhttp
introduce Okhttp
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送
 
微博架构Ppt
微博架构Ppt微博架构Ppt
微博架构Ppt
 
高性能存储引擎TokuDB剖析
高性能存储引擎TokuDB剖析高性能存储引擎TokuDB剖析
高性能存储引擎TokuDB剖析
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
 

20081128 http caching_in_php

  • 1. HTTP Caching in PHP hunter@rakuya.com.tw Nov. 2008
  • 2. F5 和 Ctrl-F5 的差別?
  • 3. Table of Contents • HTTP Overview • Rakuya JS Loader
  • 5. A GET Request GET /index.php HTTP/1.1 Host: www.rakuya.com.tw User-Agent:Mozilla/4.0 (...) HTTP/1.1 200 OK Content-Type: text/html Content-Length: 355 <html>...
  • 6. Last-Modified Header HTTP/1.1 200 OK Content-Type: text/html Content-Length: 355 Last-Modified: Thu, 27 Nov 2008 17:27:48 GMT <html>...
  • 7. Last Modified – Request • Conditional Request  由 Server 端再判斷一次是否要更新內容 GET /index.php HTTP/1.1 Host: www.rakuya.com.tw User-Agent:Mozilla/4.0 (...) If-Modified-Since: Thu, 27 Nov 2008 17:27:48 GMT HTTP/1.1 304 Not Modified Content-Type: text/html Content-Length: 0 Last-Modified: Thu, 27 Nov 2008 17:27:48 GMT
  • 8. Last Modified - Ctrl-F5 • 清除掉 If-Modified-Since  當成新的 request GET /index.php HTTP/1.1 Host: www.rakuya.com.tw User-Agent:Mozilla/4.0 (...) If-Modified-Since: Thu, 27 Nov 2008 17:27:48 GMT HTTP/1.1 200 OK Content-Type: text/html Content-Length: 355 <html>...
  • 9. Expires Header HTTP/1.1 200 OK Content-Type: text/html Content-Length: 355 Expires: Wed, 31 Dec 2008 23:59:59 GMT <html>...
  • 10. Expires - Before Refresh • Cached
  • 12. DEMO
  • 13. 正解 • F5 和 Ctrl-F5  都是重新向 server 發出 request • F5  解除 Expires 造成的 local 端的 cache • Ctrl-F5  清除 Last-Modified (或 ETag) 造成的 conditional request
  • 15. 幸好 F5 和 Ctrl-F5 在 Firefox 作用相似
  • 16. 不幸的是 Google Chrome 實做方式不一樣 F5 和 Ctrl-F5 分不太出來差別...
  • 18. ETag Header • 與 Last-Modifed 相似,但不限於使用日期, 常見的使用方式是給檔案的 MD5 HTTP/1.1 200 OK Content-Type: text/html Content-Length: 355 Etag: fc5e038d38a57032085441e7fe7010b0 <html>...
  • 19. ETag Header - Request • Conditional Request  一樣由 Server 端判斷是否要更新內容 GET /index.php HTTP/1.1 Host: www.rakuya.com.tw User-Agent:Mozilla/4.0 (...) If-None-Match: fc5e038d38a57032085441e7fe7010b0 HTTP/1.1 304 Not Modified Content-Type: text/html Content-Length: 0 Etag: fc5e038d38a57032085441e7fe7010b0
  • 20. ETag Header - Ctrl-F5 • 清除 If-None-Matched  當成新的 request GET /index.php HTTP/1.1 Host: www.rakuya.com.tw User-Agent:Mozilla/4.0 (...) If-None-Match: fc5e038d38a57032085441e7fe7010b0 HTTP/1.1 200 OK Content-Type: text/html Content-Length: 355 <html>...
  • 22. Objective • 使用 php 實做 • 多檔合併 (第一次 Request 速度加快) • Cache (減少 Request) • Conditional Request (第二次 Request 時速 度加快) • 任一檔案被修改時能即時送出正確的結果 • pack (減少檔案大小)
  • 23. Flow • 送出 Expires Header • 判斷並處理 If-Modified-Since  若無更新,則送出 HTTP 304 • 讀取並處理所有檔案 (Disk IO) • 判斷並處理 If-None-Match  若無更新,則送出 HTTP 304 • 完整 Output
  • 24. Usage • loader.php?a.js&b.js&c.js&...  透過 ETag 來處理檔案的 md5,檔案一更新, 就會立即更新  Ex: http://www.rakuya.com.tw/js/loader.php?json2.pack.js&jquery- 1.2.6.pack.js&jquery.blockUI.pack.js&jquery.mousewheel.pack.js&jquery.scrollTo- min.js&ui.core.pack.js&ui.slider.pack.js&item.js&fl.js&ad.js&map_libs_stable/mapstation.js& map_libs_stable/RA_hintwindow.js&map_libs_stable/RA_infowindow_2.js&map_libs_stable/ RakuyaMapExt.js&RAKUYA.js&RAKUYA.search.js&RAKUYA.searchHistory.js&jquery.autoc omplete.pack.js&RAKUYA.data.cityarea.js&jquery.scrollbox.js&RAKUYA.excel.menu.js PHP: header('Etag: '. md5($file_contents));
  • 25. Options • &ver=20081105 • &ver=20081105112233  透過 Last-Modifed 產生 Conditional Request, 可減少 Disk IO PHP: header('Last-Modified: '. gmdate(DATE_RFC1123));
  • 26. Options - cont. • &opt=packall  全部檔案一起做 pack (事實上我也沒用過) • &opt=plaintext  不做壓縮,方便除錯
  • 27. 建議使用方式 • DEV 開發時  把 js 加到 loader 的白名單內 (pack用)  先不使用 &ver= 的參數 • 正式機上  加上 &ver= 的參數,減少 Disk IO
  • 29. 每個 statement 都要加上 ; var foo = 1; var bar = function() { alert(foo); }; function bar2() { bar(); }
  • 30. TODO • Remove BOM From UTF-8 • Minify Option • Server-Side File Caching • URL Rewrite • Gzip Encoding • CSS Loader Enhancement
  • 32. Achieved • Rule 1: Make Fewer HTTP Requests • Rule 3: Add an Expires Header • Rule 5: Put Stylesheets at the Top • Rule 6: Put Scripts at the Bottom • Rule 7: Avoid CSS Expressions • Rule 8: Make JavaScript and CSS External • Rule 10: Minify JavaScript • Rule 13: Configure ETags
  • 34. Recommended Links • Exceptional Performance (YDN) http://developer.yahoo.com/performance/ • Combine - Another JS/CSS Loader http://rakaz.nl/extra/code/combine