
目前很多网站都使用Squid作为前端缓存服务器并取得了很好的效果,成都全搜索也分别在和电信部署了专门的前端缓存服务器用于缓存图片,视频,静态页面,js等静态资源。squid 缓存原理
(全搜索系统架构逻辑)
网站进行内容更新是常有的事情,当被缓存的资源更新时,前端Squid缓存服务器内容也必须要相应的更新,否则用户就可能会看到过期的数据。当没有程序支持时就需要每次登录到服务器上执行刷新操作,在服务器数量小的的时候这种方式还可行,如果服务器数量上了一定的规模,这就是一种非常笨重的处理方式,以下分别介绍通过编程方式实现刷新Squid的三种方法:
1.refresh_pattern用于配置Squid的刷新策略,当Squid没有配置ignonre-reload来忽略客户端no-cache和reload头的时候。
ignore-reload-ignoresaclientno-cacheorreloadheader.DoingthisVIOLATEStheHTTPstandard.Enablingthisfeaturecouldmakeyouliableforproblemswhichitcauses.(ignore-reload,忽略客户端no-cache或reload头,这是违反HTTP标准的做法,允许此特性可能导致相关问题.)
在这种情况下可以通过模拟客户端向服务器发送no-cache头(ctrl+f5就完成此功能)来实现刷新操作。发送的请求头如下:

(httpwatch关于no-cache请求头的截图)
<?php
/**
* 刷新Squid缓存
*
*/
intece Flush_Cache
{
/**
* 执行刷新操作
*
* @param void $url 待刷新的URL地址
*/
public function flush($url);
}
/**
* 通过发送HTTP Header头实现刷新功能
*
*/
class Flush_Cache_HTTP_Header_Impl implements Flush_Cache
{
/**
* @see Flush_Cache::flush()
*
* @param void $url
*/
public function flush($url)
{
if(empty($url))
{
return;
}
$url_component = parse_url($url);
global $g_squid_servers;
foreach ($g_squid_servers as $server)
{
$squid_params = split(':' , $server);
$fsocket = fsockopen($squid_params[0], intval($squid_params[1]), $errono, $errstr, 3);
if(FALSE != $fsocket)
{
$head = "HEAD {$url_component['path']} HTTP/1.1\r\n";
$head .= "Accept: */*\r\n";
$head .= "Host: {$url_component['host']}\r\n";
$head .= "Cache-Control: no-cache\r\n";
$head .= "\r\n";
echo $head;
fwrite($fsocket , $head);
while (!feof($fsocket))
{
$line = fread($fsocket , 4096);
echo $line;
}
fclose($fsocket);
}
}
}
}
$g_squid_servers = array('192.168.2.88:80');
$flush_cache = new Flush_Cache_HTTP_Header_Impl();
$flush_cache->flush('http://ent.cdqss.com/index.html');
?>
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33116-1.html
那些所谓的创新公司靠圈钱过日子
中国统一的日子也就到了
包括岛礁上的军事设施建设