原文地址: 配置好squid用了一段时间后,发现一个问题,那就是在修改页面的时候,经常遇到缓存无法及时更新,如果正好页面修改出了问题,页面出错,这样就导致用户在一段时间内无法正常访问网站,给用户造成非常不好的体验。有没什么办法强制squid立刻更新或者清除某个页面的缓存呢?网上搜了一下,原来squid有个PURGE方式,可以通过命令:
squidclient -h 缓存服务器IP -p 缓存服务器端口 -m PURGE 欲更新的URL
|
来进行更新。但是默认配置PURGE是关闭的,需要修改/etc/squid/squid.conf,添加下面的内容:
acl purge method PURGE
acl myservers src 运行squidclient的IP(可以为多个,以空格分隔)
http_access allow purge myservers
http_access deny purge
|
这样就可以在myservers所列的任意IP上进行清除缓存操作了。
但是这样需要在Linux下运行命令来进行操作,对于不懂linux命令的人来说这样的操作还是有点麻烦的,有没有简单的办法呢?答案是肯定的,我们可以写个WEB程序,接收表单提交过来的URL并通过Socket模拟PURGE请求就可以了,任意语言均可,只要把运行此程序的服务器IP加入到上面的myservers列表就可以了。网上找了个现成的PHP版函数,略加修改如下:
<?
header("Content-Type: text/html; charset=utf-8");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">
<html xmlns="" lang="utf-8">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="utf-8" />
<meta name="author" content="dragonbbc" />
<meta name="description" content="squid缓存更新" />
</head>
<body>
<form method="POST">
URL地址(如有多个以,分隔):<input name="url" id="url" />
缓存服务器IP:
<select name="serverip" id="serverip">
<option value="">自动判断</option>
<option value="IP1">缓存服务器1</option>
<option value="IP2">缓存服务器2</option>
<option value="IP3">缓存服务器3</option>
</select>
端口:
<input name="serverport" id="serverport" size="4"/>
<input type="submit" value="提交" name="submit" id="submit" />
</form>
<?
$serverip = $_POST['serverip'];
$serverport = $_POST['serverport'];
$url = $_POST['url'];
if (isset($url)) {
if (strrpos($url, ',')) {
$urls = explode(',', $url);
foreach ($urls AS $url) {
purge($serverip, $serverport, $url);
echo " ";
}
} else {
purge($serverip, $serverport, $url);
}
}
?>
</body>
</html>
<?php
function purge($ip, $port, $url)
{
$host = parse_url($url);
$host = $host['host'];
if (empty($ip)) {
$ip = gethostbyname($host);
}
if (empty($port)) {
$port = "80";
}
echo "正在从服务器".$ip."更新".$url.":";
$errstr = '';
$errno = '';
$fp = fsockopen ($ip, $port, $errno, $errstr, 2);
if (!$fp)
{
echo "连接失败!";
return false;
}
else
{
$out = "PURGE ".$url." HTTP/1.1\r\n";
$out .= "Host:".$host."\r\n";
$out .= "Connection: close\r\n\r\n";
fputs ($fp, $out);
$out = fgets($fp , 4096);
fclose ($fp);
echo $out;
return true;
}
}
?>
|
将purge.php传上服务器,先访问一个不存在的文件如test.htm,让squid为其建立缓存,然后新建test.htm随便输入些内容,再重新访问,仍然提示404错误。运行purge.php,填入URL地址,运行,再访问,正常显示。搞定!
--------------------------------------------------------------------------
说明:
之所以用这个一是因为http://blog.s135.com/post/308/介绍的这款不错的软件编译不支持64位CPU;二是毕竟是squid自带的,搭配使用比较好。
在将$purge/Makefile从
OPT_NORM = -march=pentium -O2
|
改为
OPT_NORM = -march=x86-64 -O2
|
后,make编译不成功,报错
g++ -ffor-scope -DHAS_BOOL -DHAS_PSIGNAL -DHAS_PSIGNAL -DLIBCVERSION=6 -pipe -DLINUX -DMAJOR=2 -DMINOR=6 -DSOCKLEN=size_t -march=x86-64 -O2 -c convert.cc -o convert.o convert.cc: In function const char* my_sock_fd2a(int, char*, bool): convert.cc:113: error: cannot convert size_t* to socklen_t* for argument 3 to int getpeername(int, sockaddr*, socklen_t*) convert.cc:114: error: cannot convert size_t* to socklen_t* for argument 3 to int getsockname(int, sockaddr*, socklen_t*) make: *** [convert.o] Error 1 |
阅读(2365) | 评论(0) | 转发(0) |