坚信科学,分享技术

2018全新版本,未来在blog.54chen.com更新博客!

>>>尝试更加利于阅读的2014版科学院,以后都在新版上写。

如何用php代码清空squid缓存下的指定文件

[文章作者:陈臻 本文版本:v1.0 最后修改:2009.3.5 转载请注明原文链接:http://www.54chen.com/c/490]

    PURGE 是一个特殊的HTTP请求方法。它是Squid 的专有方法,没有在任何RFC 里定义。它让管理员能强制删除缓存对象。既然该方法有些危险,squid 默认拒绝PURGE 请求,除非你定义了ACL 引用了该方法。否则,任何能访问cache 者也许能够删除任意缓存对象。我推荐仅仅允许来自localhost 的PURGE:
acl Purge method PURGE
acl Localhost src 127.0.0.1
http_access allow Purge Localhost
http_access deny Purge  (squid.conf摘要)

以下是使用purge删除指定文件的两个函数:

    //发送socket数据
function socket_service($ip, $port='80', $out="")
{
 if(trim($ip)=="")return "Error: without dest host!";
 if($out=='') $out="GET / HTTP/1.1\r\nHost: $ip\r\n\r\n";
 $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
 $sourceips['internal'] = '6.4.10.9';
 $sourceips['external'] = '6.4.10.9';
 socket_bind($sock, $sourceips['internal']);
 socket_connect($sock, $ip, $port);
 socket_write($sock, $out);
 $return=socket_read($sock,100000);
 socket_close($sock);
 return $return;
}
//更新url指定的文件cache
function purgeFile($url)
{
  $squid_dv=array("1.5.5.6","6.6.8.8");//两个前端squid
  $request="PURGE $url \n";
  foreach($squid_dv as $key => $ip)
  {
   $result=socket_service($ip,80,$request);
  }
}

  这样只需要在代码里使用 purgeFile('/xxx.gif');即可将上述两个服务器中指定的路径文件缓存删除。


原创文章如转载,请注明:转载自五四陈科学院[http://www.54chen.com]
本文链接: http://www.54chen.com/php-tech/%e5%a6%82%e4%bd%95%e7%94%a8php%e4%bb%a3%e7%a0%81%e6%b8%85%e7%a9%basquid%e7%bc%93%e5%ad%98%e4%b8%8b%e7%9a%84%e6%8c%87%e5%ae%9a%e6%96%87%e4%bb%b6.html

This entry was posted in php and tagged , . Bookmark the permalink.

5 Responses to “如何用php代码清空squid缓存下的指定文件”

  1. deprecated 说:

    这个方法在网络不好的时候很有可能影响到整个应用

  2. cc0cc 说:

    网络不好可以用用张宴的shell版本 在服务器上crontab跑就ok了

  3. [...] 首先使用yum安装上mysql的开发包,供php扩展mysql使用: yum -y install mysql-devel 安装patch工具: yum -y install patch tar zxvf [...]

  4. [...] public void flushSquid() { try { int port = 80; Socket socket = new Socket(”127.0.0.1″, port); String path = [...]

  5. 小桔灯 说:

    请教一下博主,我在内网测试的时候.
    $sourceips['internal'] = '6.4.10.9';
    $sourceips['external'] = '6.4.10.9';
    这个填写为外网的ip提示无法绑定.是否要在路由里做dmz?
    cdn的ip是公网的.

Leave a Reply