PHP緩存技術

廣泛緩存技術
數據緩存:這裏所說的數據緩存是指數據庫查詢緩存,每次訪問頁面的時候,都會先檢測相應的緩存數據是否存在,若是不存在,就鏈接數據庫,獲得數據,並把查詢結果序列化後保存到文件中,之後一樣的查詢結果就直接從緩存表或文件中得到。
用的最廣的例子看Discuz的搜索功能,把結果ID緩存到一個表中,下次搜索相同關鍵字時先搜索緩存表。
舉個經常使用的方法,多表關聯的時候,把附表中的內容生成數組保存到主表的一個字段中,須要的時候數組分解一下,這樣的好處是隻讀一個表,壞處就是兩個數據同步會多很多步驟,數據庫永遠是瓶頸,用硬盤換速度,是這個的關鍵點。
頁面緩存
每次訪問頁面的時候,都會先檢測相應的緩存頁面文件是否存在,若是不存在,就鏈接數據庫,獲得數據,顯示頁面並同時生成緩存頁面文件,這樣下次訪問的時候頁面文件就發揮做用了。(模板引擎和網上常見的一些緩存類一般有此功能)
時間觸發緩存
檢查文件是否存在而且時間戳小於設置的過時時間,若是文件修改的時間戳比當前時間戳減去過時時間戳大,那麼就用緩存,不然更新緩存。
內容觸發緩存
當插入數據或更新數據時,強制更新緩存。
靜態緩存:
這裏所說的靜態緩存是指靜態化,直接生成HTML或XML等文本文件,有更新的時候重生成一次,適合於不太變化的頁面,這就不說了。
以上內容是代碼級的解決方案,我直接CP別的框架,也懶得改,內容都差很少,很容易就作到,並且會幾種方式一塊兒用,但下面的內容是服務器端的緩存方案,非代碼級的,要有多方的合做才能作到
內存緩存:
Memcached是高性能的,分佈式的內存對象緩存系統,用於在動態應用中減小數據庫負載,提高訪問速度。
這裏說下Memcached的例子:
代碼
     
     
     
     
<? php
$memcache = new Memcache;
$memcache -> connect( ' localhost ' , 11211 ) or die ( " Could not connect " );
$version = $memcache -> getVersion();
echo " Server's version: " . $version . " \n " ;
$tmp_object = new stdClass;
$tmp_object -> str_attr = ' test ' ;
$tmp_object -> int_attr = 123 ;
$memcache -> set( ' key ' , $tmp_object , false , 10 ) or die ( " Failed to save data at the server " );
echo " Store data in the cache (data will expire in 10 seconds)\n " ;
$get_result = $memcache -> get( ' key ' );
echo " Data from the cache:\n " ;
var_dump ( $get_result );
?>
讀庫的例子:
代碼
     
     
     
     
<? php
$sql = ' SELECT * FROM users ' ;
$key = md5 ( $sql ); // memcached 對象標識符
if ( ! ( $datas = $mc -> get( $key )) ) {
// 在 memcached 中未獲取到緩存數據,則使用數據庫查詢獲取記錄集。
echo " n " . str_pad ( ' Read datas from MySQL. ' , 60 , ' _ ' ) . " n " ;
$conn = mysql_connect ( ' localhost ' , ' test ' , ' test ' );
mysql_select_db ( ' test ' );
$result = mysql_query ( $sql );
while ( $row = mysql_fetch_object ( $result ))
$datas [] = $row ;
// 將數據庫中獲取到的結果集數據保存到 memcached 中,以供下次訪問時使用。
$mc -> add( $key , $datas );
}
else {
echo " n " . str_pad ( ' Read datas from memcached. ' , 60 , ' _ ' ) . " n " ;
}
var_dump ( $datas );
?>
php的緩衝器
有eaccelerator, apc, phpa,xcache,這個這個就不說了吧,搜索一堆一堆的,本身看啦,知道有這玩意就OK
MYSQL緩存
這也算非代碼級的,經典的數據庫就是用的這種方式,看下面的運行時間,0.09xxx之類的
我貼段根據藍色那傢伙修改後部分my.ini吧,2G的MYISAM表能夠在0.05S左右,聽說他先後改了有快一年
代碼拷貝框
代碼
     
     
     
     
[client]
……
default - character - set = gbk
default - storage - engine = MYISAM
max_connections
= 600
max_connect_errors
= 500
back_log
= 200
interactive_timeout
= 7200
query_cache_size
= 64M
……
table_cache
= 512
……
myisam_max_sort_file_size
= 100G
myisam_max_extra_sort_file_size
= 100G
myisam_sort_buffer_size
= 128M
key_buffer_size
= 1024M
read_buffer_size
= 512M
……
thread_concurrency
= 8
基於反向代理的Web緩存:
如Nginx,SQUID,mod_proxy(apache2以上又分爲mod_proxy和mod_cache)
NGINX的例子
 
代碼
     
     
     
     
< nginx . conf >
# user nobody;
worker_processes 4 ;
error_log logs / error . log crit;
pid logs
/ nginx . pid;
worker_rlimit_nofile
10240 ;
events {
use epoll;
worker_connections
51200 ;
}
http {
include mime . types;
default_type application
/ octet - stream;
sendfile on;
keepalive_timeout
65 ;
tcp_nodelay on;
# server pool
upstream bspfrontsvr {
server
10.10 . 10.224 : 80 weight = 1 ;
server
10.10 . 10.221 : 80 weight = 1 ;
}

upstream bspimgsvr {
server
10.10 . 10.201 : 80 weight = 1 ;
}

upstream bspstylesvr {
server
10.10 . 10.202 : 80 weight = 1 ;
}

upstream bsphelpsvr {
server
10.10 . 10.204 : 80 weight = 1 ;
}

upstream bspwsisvr {
server
10.10 . 10.203 : 80 weight = 1 ;
}

upstream bspadminsvr {
server
10.10 . 10.222 : 80 weight = 1 ;
}

upstream bspbuyersvr {
server
10.10 . 10.223 : 80 weight = 1 ;
}

upstream bspsellersvr {
server
10.10 . 10.225 : 80 weight = 1 ;
}
upstream bsploginsvr {
server
10.10 . 10.220 : 443 weight = 1 ;
}
upstream bspregistersvr {
server
10.10 . 10.220 : 80 weight = 1 ;
}
log_format test_com
' $remote_addr - $remote_user [$time_local] "$request" '
' $status $body_bytes_sent "$http_referer" "$http_user_agent" ' ;
# --------------------------------------------------------------------
# img.test.com
server {
listen
10.10 . 10.230 : 80 ;
server_name img
. test . com;
location
/ {
proxy_pass http
: // bspimgsvr;
include proxy_setting . conf;
}
access_log logs
/ img . log test_com;
}

# style.test.com
server {
listen
10.10 . 10.230 : 80 ;
server_name style
. test . com;
location
/ {
proxy_pass http
: // bspstylesvr;
include proxy_setting . conf;
}
access_log logs
/ style . log test_com;
}


# help.test.com
server {
listen
10.10 . 10.230 : 80 ;
server_name help
. test . com;
location
/ {
proxy_pass http
: // bsphelpsvr;
include proxy_setting . conf;
}
access_log logs
/ help . log test_com;
}


# admin.test.com
server {
listen
10.10 . 10.230 : 80 ;
server_name admin
. test . com;
location
/ {
proxy_pass http
: // bspadminsvr;
include proxy_setting . conf;
}
access_log logs
/ admin . log test_com;
}

# buyer.test.com
server {
listen
10.10 . 10.230 : 80 ;
server_name buyer
. test . com;
location
/ {
proxy_pass http
: // bspbuyersvr;
include proxy_setting . conf;
}
access_log logs
/ buyer . log test_com;
}

# seller.test.com
server {
listen
10.10 . 10.230 : 80 ;
server_name seller
. test . com;
location
/ {
proxy_pass http
: // bspsellersvr;
include proxy_setting . conf;
}
access_log logs
/ seller . log test_com;
}
# wsi.test.com
server {
listen
10.10 . 10.230 : 80 ;
server_name wsi
. test . com;
location
/ {
proxy_pass http
: // bspwsisvr;
include proxy_setting . conf;
}
access_log logs
/ wsi . log test_com;
}
# www.test.com
server {
listen
10.10 . 10.230 : 80 ;
server_name www
. test . com *. test . com;
location
~ ^/ NginxStatus / {
stub_status on;
access_log off;
}
location
/ {
proxy_pass http
: // bspfrontsvr;
include proxy_setting . conf;
}
access_log logs
/ www . log test_com;
error_page
500 502 503 504 / 50x . html;
location
= / 50x . html {
root html;
}
}
# login.test.com
server {
listen
10.10 . 10.230 : 443 ;
server_name login
. test . com;
ssl on;
ssl_certificate cert
. pem;
ssl_certificate_key cert
. key ;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL
:! ADH :! EXPORT56 : RC4 + RSA :+ HIGH :+ MEDIUM :+ LOW :+ SSLv2 :+ EXP ;
ssl_prefer_server_ciphers on;
location
/ {
proxy_pass https
: // bsploginsvr;
include proxy_setting . conf;
}
access_log logs
/ login . log test_com;
}
# login.test.com for register
server {
listen
10.10 . 10.230 : 80 ;
server_name login
. test . com;
location
/ {
proxy_pass http
: // bspregistersvr;
include proxy_setting . conf;
}
access_log logs
/ register . log test_com;
}

}
< conf / proxy_setting . conf >
proxy_redirect off;
proxy_set_header Host
$host ;
proxy_set_header X
- Real - IP $remote_addr ;
proxy_set_header X
- Forwarded - For $proxy_add_x_forwarded_for ;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout
90 ;
proxy_send_timeout
90 ;
proxy_read_timeout
90 ;
proxy_buffer_size 4k;
proxy_buffers
4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
mod_proxy的例子:
代碼
     
     
     
     
< VirtualHost *>
ServerName www
. zxsv . com
ServerAdmin admin@zxsv
. com
# reverse proxy setting
ProxyPass / http : // www.zxsv.com:8080/
ProxyPa***everse / http : // www.zxsv.com:8080/
#
cache dir root
CacheRoot " /var/www/proxy "
# max cache storage
CacheSize 50000000
# hour: every 4 hour
CacheGcInterval 4
# max page expire time: hour
CacheMaxExpire 240
# Expire time = (now - last_modified) * CacheLastModifiedFactor
CacheLastModifiedFactor 0.1
# defalt expire tag: hour
CacheDefaultExpire 1
# force complete after precent of content retrived: 60-90%
CacheForceCompletion 80
CustomLog
/ usr / local / apache / logs / dev_access_log combined
</ VirtualHost >
而SQUID的例子 ,這方面網上有寫的太多,你們本身搜索一下
DNS輪詢
BIND是一款開放源碼的DNS服務器軟件,這個要提及來就大了,本身搜索去,你們知道有這個東西就好了。 我知道的有chinacache等大站就是這樣作的,說簡單點就是多服務器啦,把同一個頁面或文件緩存到不一樣的服務器上,按南北自動解析到相關的服務器中。
相關文章
相關標籤/搜索