一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP企業級應用之常見緩存技術篇

PHP企業級應用之常見緩存技術篇

2019-11-16 13:37php教程網 PHP教程

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

普遍緩存技術 
數據緩存:這里所說的數據緩存是指數據庫查詢緩存,每次訪問頁面的時候,都會先檢測相應的緩存數據是否存在,如果不存在,就連接數據庫,得到數據, 并把查詢結果序列化后保存到文件中,以后同樣的查詢結果就直接從緩存表或文件中獲得。 
用的最廣的例子看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 [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 等大站就是這樣做的,說簡單點就是多服務器啦,把同一個頁面或文件緩存到不同的服務器上,按南北自動解析到相關的服務器中。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产suv精品一区二区四区三区 | 福利视频导航大全 | 我将她侵犯1~6樱花动漫在线看 | 美女被网站 | 国产绳艺在线播放 | 大伊香蕉精品视频一区 | 草草草在线 | 大胸纲手被羞羞漫画网站 | 女子监狱第二季在线观看免费完整版 | 成人免费一区二区三区在线观看 | 成人毛片高清视频观看 | 精品国产福利一区二区在线 | 我与旗袍老师疯狂床震 | 日韩操比视频 | 欧美日韩色图 | 91午夜视频 | vomoulei成人舞蹈 | 色婷婷久久综合中文久久一本 | se婷婷| 精品性影院一区二区三区内射 | 青青五月天 | 国产香蕉一区二区精品视频 | 五月激情丁香婷婷综合第九 | 国产清纯女高中生在线观看 | 国产aⅴ一区二区三区 | 欧美又大又粗又长又硬 | 2020年精品国产午夜福利在线 | 猫咪社区免费资源在线观看 | 四虎网址| 99热精品69堂国产 | 日韩先锋| 免费看又黄又爽又猛的视频软件- | 亚洲天堂2015 | 天天操天天干天天 | 欧美大片一区 | 狠狠色狠狠色综合曰曰 | 8x在线永久成人影院 | 国产精品久久久久久影院 | 农村美女沟厕嘘嘘被偷看 | 暖暖影院日本版 | 国产福利视频一区二区微拍 |