天天看點

PHP緩存技術

1普遍緩存技術

用的最廣的例子看discuz的搜尋功能,把結果id緩存到一個表中,下次搜尋相同關鍵字時先搜尋緩存表。

舉個常用的方法,多表關聯的時候,把附表中的内容生成數組儲存到主表的一個字段中,需要的時候數組分解一下,這樣的好處是隻讀一個表,壞處就是兩個資料同步會多不少步驟,資料庫永遠是瓶頸,用硬碟換速度,是這個的關鍵點。

2頁面緩存 :

每次通路頁面的時候,都會先檢測相應的緩存頁面檔案是否存在,如果不存在,就連接配接資料庫,得到資料,顯示頁面并同時生成緩存頁面檔案,這樣下次通路的時候頁面檔案就發揮作用了。(模闆引擎和網上常見的一些緩存類通常有此功能)

時間觸發緩存 :

檢查檔案是否存在并且時間戳小于設定的過期時間,如果檔案修改的時間戳比目前時間戳減去過期時間戳大,那麼就用緩存,否則更新緩存。

内容觸發緩存 :

當插入資料或更新資料時,強制更新緩存。

3靜态緩存:

這裡所說的靜态緩存是指靜态化,直接生成html或xml等文本檔案,有更新的時候重生成一次,适合于不太變化的頁面,這就不說了。

以上内容是代碼級的解決方案,我直接cp别的架構,也懶得改,内容都差不多,很容易就做到,而且會幾種方式一起用,但下面的内容是伺服器端的緩存方案,非代碼級的,要有多方的合作才能做到

4記憶體緩存:

memcached 是高性能的,分布式的記憶體對象緩存系統,用于在動态應用中減少資料庫負載,提升通路速度。

php的緩沖器 :

有eaccelerator, apc, phpa,xcache,這個這個就不說了吧,搜尋一堆一堆的,自己看啦,知道有這玩意就ok

這也算非代碼級的,經典的資料庫就是用的這種方式,看下面的運作時間,0.09xxx之類的

我貼段根據藍色那家夥修改後部分my.ini吧,2g的myisam表可以在0.05s左右,據說他前後改了有快一年

代碼拷貝框

PHP緩存技術

[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的例子

PHP緩存技術

<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_name  style.test.com;  

                        proxy_pass      http://bspstylesvr;  

        access_log  logs/style.log  test_com;  

    #help.test.com  

        server_name  help.test.com;  

                        proxy_pass      http://bsphelpsvr;  

        access_log  logs/help.log  test_com;  

    #admin.test.com  

        server_name  admin.test.com;  

                        proxy_pass      http://bspadminsvr;  

        access_log  logs/admin.log  test_com;  

    #buyer.test.com  

        server_name  buyer.test.com;  

                        proxy_pass      http://bspbuyersvr;  

        access_log  logs/buyer.log  test_com;  

    #seller.test.com  

        server_name  seller.test.com;  

                        proxy_pass      http://bspsellersvr;  

        access_log  logs/seller.log  test_com;  

    #wsi.test.com  

        server_name  wsi.test.com;  

                        proxy_pass      http://bspwsisvr;  

        access_log  logs/wsi.log  test_com;  

    #www.test.com  

        server_name  www.test.com   *.test.com;  

        location ~ ^/nginxstatus/ {  

            stub_status on;  

            access_log off;  

                        proxy_pass      http://bspfrontsvr;  

        access_log  logs/www.log  test_com;  

        error_page   500 502 503 504  /50x.html;  

        location = /50x.html {  

            root   html;  

    }    

    #login.test.com  

        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;  

                        proxy_pass        https://bsploginsvr;  

        access_log  logs/login.log  test_com;  

    #login.test.com for register  

                        proxy_pass        http://bspregistersvr;  

        }     

        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的例子:

PHP緩存技術

<virtualhost *>  

servername www.zxsv.com  

serveradmin [email protected]  

# reverse proxy setting  

proxypass / http://www.zxsv.com:8080/  

proxypassreverse / 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等大站就是這樣做的,說簡單點就是多伺服器啦,把同一個頁面或檔案緩存到不同的伺服器上,按南北自動解析到相關的伺服器中。