Chinaunix首页 | 论坛 | 博客
  • 博客访问: 325916
  • 博文数量: 104
  • 博客积分: 3025
  • 博客等级: 中校
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-02 11:12
文章分类

全部博文(104)

文章存档

2013年(1)

2011年(2)

2010年(30)

2009年(29)

2008年(8)

2007年(15)

2006年(17)

2005年(2)

我的朋友

分类:

2010-06-04 15:08:22

原文地址:

   配置好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


阅读(2353) | 评论(0) | 转发(0) |
0

上一篇:redis操作

下一篇:mysql主从复制

给主人留下些什么吧!~~