批量清除nginx缓存的方法

我公司的一个客户在国外访问测试网站比较麻烦,因此我在一台机器上安装了一个nginx,并且使用nginx的proxy_cache模块做缓存服务器,由于由于修改比较多,每次使用ngx_cache_purge清除cache只能清除几个url,没有很好的办法去清除某个目录的缓存。我研究了nginx的缓存文件格式,发现可以从中提取出url出来,如下图所示,url是以"KEY:"开头以0x0A结尾

我写了一个程序能够实现

1.提交一批url进行清除对应的cache

2.提交一批url目录可以清除包含这些目录的url,若是提交域名可以清除整站

3.查看某个目录下的缓存文件是否缓存上

4.可以添加多个站点

需要县安装ngx_cache_purge

代码如下

 

 
   
  1. /*  
  2.  * 作者:yifangyou  
  3.    日期:2012-07-21 14:43:00  
  4.    功能:按照多个目录或者多个URL的方式,清除nginx的cache,或者查看nginx cache 缓存  
  5.    要求:nginx + ngx_cache_purge  
  6.  */ 
  7.    //代理服务器的ip  
  8.   $proxyIp="127.0.0.1";  
  9.   //代理服务器端口  
  10.     $proxyPort=80;  
  11.     //代理服务器的缓存目录  
  12.     $cacheDir="/opt/proxy_cache_dir/";  
  13.     $proxySites=array(  
  14.     //用户访问的域名 => 被代理的实际网站的域名,若是都是80的话就是一样即可  
  15.      "http://www.test.com"=>"http://www.test.com" 
  16.     );  
  17. //输出文件  
  18. $output="";      
  19. $result=array();  
  20. $filedirs = array();  
  21. //只查看缓存文件,不清除  
  22. if($_POST["view"]){  
  23.          $accessSite=$_POST["accessSite"];  
  24.      $proxySite=$proxySites[$accessSite];  
  25.          $clearUrls=array();  
  26.          $clearUrls=explode ("\n",$_POST["dirs"]);  
  27.          if($$proxySite){  
  28.                  foreach($ds as $d){  
  29.                          $d=str_replace($accessSite$proxySite,$d);  
  30.                          $clearUrls[]=$d;  
  31.                  }  
  32.          }  
  33.          scan_dir($cacheDir);  
  34.          $cacheurls = array();  
  35.          foreach($filedirs as $filename){  
  36.                 if(!is_file($filename)){  
  37.                         continue;  
  38.                 }  
  39.                 $cacheUrl=getUrlFromCacheFile($filename);  
  40.                                 if(count($clearUrls)){  
  41.                                     $cacheurls[]=$cacheUrl;  
  42.                                     continue;  
  43.                                 }  
  44.                 foreach($clearUrls as $clearUrl){  
  45.                   $clearUrl=str_replace($accessSite$proxySite,$clearUrl);  
  46.                   $pos=strpos($cacheUrl,$clearUrl);  
  47.                   // echo "$cacheUrl,$clearUrl,$pos
    ";
     
  48.                   //比较http://www.b.com/a/b.jpg和http://www.b.com/a  
  49.                   if($pos===0){  
  50.                      $cacheurls[]=$cacheUrl;  
  51.                      break;  
  52.                    }  
  53.                 }  
  54.         }  
  55.  
  56. }else //清除一批URL  
  57. if($_POST["urls"]){  
  58.     $accessSite=$_POST["accessSite"];  
  59.     $proxySite=$proxySites[$accessSite];  
  60.     $output.="'font-size:16px;font-weight:bold'>执行结果  
  61. \n\n";  
  62.     $urls=explode ("\n",$_POST["urls"]);  
  63.     foreach($urls as $url2){  
  64.         $url=trim($url2);  
  65.         $output.="------------------------$url start-----------------------------\n";  
  66.         $pos = strpos($url$accessSite);  
  67.         if ($pos !== false && $pos==0) {  
  68.             $url=str_replace($accessSite$proxySite,$url);  
  69.             if(purge($proxyIp,$proxyPort,$url)==0){  
  70.                 $result[$url2]=0;  
  71.             }else{  
  72.                 $result[$url2]=1;  
  73.             }  
  74.         }else{  
  75.             $output.="skip $url\n";  
  76.             $result[$url2]=-1;  
  77.         }  
  78.         $output.="------------------------$url end -----------------------------\n";  
  79.     }  
  80.     $output.="\n";  
  81. }else//清除某个目录下的所有文件  
  82. if($_POST["dirs"]){  
  83.     $accessSite=$_POST["accessSite"];  
  84.     $proxySite=$proxySites[$accessSite];  
  85.     $clearUrls=array();  
  86.     $clearUrls=explode ("\n",$_POST["dirs"]);  
  87.     if($$proxySite){  
  88.         foreach($ds as $d){  
  89.             $d=str_replace($accessSite$proxySite,$d);  
  90.             $clearUrls[]=$d;  
  91.         }  
  92.     }  
  93.     scan_dir($cacheDir);  
  94.     $cacheurls = array();  
  95.     foreach($filedirs as $filename){  
  96.         if(!is_file($filename)){  
  97.             continue;  
  98.         }  
  99.         $cacheUrl=getUrlFromCacheFile($filename);  
  100.  
  101.         foreach($clearUrls as $clearUrl){  
  102.          $clearUrl=str_replace($accessSite$proxySite,$clearUrl);  
  103.             $pos=strpos($cacheUrl,$clearUrl);  
  104.             // echo "$cacheUrl,$clearUrl,$pos
    ";
     
  105.             //比较http://www.b.com/a/b.jpg和http://www.b.com/a  
  106.             if($pos===0){  
  107.                     $cacheurls[]=$cacheUrl;  
  108.                     break;  
  109.             }  
  110.         }  
  111.     }  
  112.     if(count($cacheurls) > 0){  
  113.         $accessSite=$_POST["accessSite"];  
  114.         $proxySite=$proxySites[$accessSite];  
  115.         $output.="'font-size:16px;font-weight:bold'>执行结果  
  116. \n\n";  
  117.         foreach($cacheurls as $url2){  
  118.  
  119.             $url=trim($url2);  
  120.             $output.="------------------------$url start-----------------------------\n";  
  121.             $pos = strpos($url$accessSite);  
  122.             if(purge($proxyIp,$proxyPort,$url)==0){  
  123.                     $result[$url2]=0;  
  124.             }else{  
  125.                     $result[$url2]=1;  
  126.             }  
  127.             $output.="------------------------$url end -----------------------------\n";  
  128.         }  
  129.         $output.="\n";  
  130.     }else{  
  131.         foreach($clearUrls as $u){  
  132.             $result[$u]=-1;  
  133.         }  
  134.     }  
  135. }  
  136. ?>  
  137.  
  138.  
  139. "http://www.w3.org/1999/xhtml">  
  140.  
  141. "Content-Type" content="text/html; charset=utf-8" />  
  142. 刷新squid  
  143.  
  144.     if($result){  
  145.         echo "URL结果\n";  
  146.         foreach($result as $url=>$isOk){  
  147.             switch($isOk){  
  148.                 case 0://成功  
  149.                 $r="成功";  
  150.                 break;  
  151.                 case 1://成功  
  152.                 $r="失败";  
  153.                 break;  
  154.                 case -1://跳过  
  155.                 $r="跳过";  
  156.                 break;  
  157.             }  
  158.             if($$proxySite){  
  159.                 $url=str_replace($proxySite$accessSite$url);  
  160.             }  
  161.             echo "$url$r\n";  
  162.         }  
  163.         echo "\n";  
  164.     }  
  165. ?>  
  166.  
  167. "" method="post">  
  168.  
  169. 选择站点:  
  170.  
  171. "accessSite" id="accessSite">  
  172.     
  173.         foreach($proxySites as $accessSite => $proxySite){  
  174.         $isSelected=$_POST["accessSite"]==$accessSite?"selected":"";  
  175.             echo "$accessSite\n";  
  176.         }  
  177.     ?>  
  178.  
  179.  
  180. "checkbox" name="view" value="1" echo $_POST["view"]?"checked":"";?>/>for="view">只查看  
  181.  
  182. 输入一组URL(一个一行):  
  183. "urls" style="width:1000px;height:200px;">if($_POST["view"])foreach($cacheurls as $cacheurl){echo "$cacheurl\n";}?>  
  184. 刷新目录(一个一行):  
  185. "dirs" style="width:1000px;height:200px;">  
  186. "submit" value="提交" />  
  187.  
  188.  
  189.     echo $output;  
  190. ?>  
  191.  
  192. //清除某个url  
  193. function purge($proxyIp,$proxyPort,$url)  
  194. {  
  195.     global $output;  
  196.     $host = parse_url($url);  
  197.     $host = $host['host'];  
  198.     $purge_url=str_replace("http://".$host,"/purge",$url);  
  199.     if (emptyempty($proxyIp)) {  
  200.         $proxyIp = gethostbyname($host);  
  201.     }  
  202.     if (emptyempty($proxyPort)) {  
  203.         $proxyPort = "80";  
  204.     }  
  205.     $output.="正在从服务器".$proxyIp."更新".$url."\n";  
  206.     $errstr = '';  
  207.     $errno = '';  
  208.     $fp = fsockopen ($proxyIp$proxyPort$errno$errstr, 2);  
  209.     if (!$fp)  
  210.     {  
  211.          $output.="连接失败!";  
  212.          return -1;  
  213.     }  
  214.     else 
  215.     {  
  216.         $out = "GET ".$purge_url." HTTP/1.1\r\n";  
  217.         $out .= "Host:".$host."\r\n";  
  218.         $out .= "Connection: close\r\n\r\n";  
  219.         $output.="***********request start**************\n";  
  220.         $output.=$out;  
  221.         $output.="***********request end **************\n";  
  222.         fputs ($fp$out);  
  223.         $output.="***********response start**************\n";  
  224.         //是否更新成功  
  225.         $isOk=false;  
  226.         while($out = fgets($fp , 4096)){  
  227.             if(strpos($out,"200 OK\r\n")!==FALSE){  
  228.                 //更新成功  
  229.                 $isOk=true;  
  230.             }  
  231.             $output.=$out;  
  232.             if($out=="\r\n"){  
  233.                 break;  
  234.             }  
  235.         }  
  236.         fclose ($fp);  
  237.         $output.="***********response end **************\n";          
  238.         flush();  
  239.         if($isOk){  
  240.             return 0;  
  241.         }else{  
  242.             return 1;  
  243.         }  
  244.     }  
  245. }  
  246.  
  247. //递归扫描cache目录下所有文件路径  
  248. function scan_dir($dir) {  
  249.         global $filedirs;  
  250.         if (!is_dir($dir)) return false;  
  251.         if ($dh = opendir($dir)) {  
  252.             while (($file = readdir($dh)) !== false) {  
  253.                 if ($file[0] == '.'continue;  
  254.                 if($file=='swap.state')continue;  
  255.                 $fullpath = "$dir/$file";  
  256.                 $filedirs[] = $fullpath;  
  257.                 if (is_dir($fullpath))   
  258.                     scan_dir($fullpath);   
  259.             }  
  260.             closedir($dh);  
  261.         }  
  262.         return $filedirs;  
  263. }  
  264. //从cache文件中提取真实的URL  
  265. function getUrlFromCacheFile($filename){  
  266.         //cache文件头长度  
  267.         $headerLen=0x1E;  
  268.         $handle = fopen($filename"rb");  
  269.         if(!$handle){  
  270.             return -1;   
  271.         }  
  272.         //读取文件的前1k字节  
  273.         $contents = fread($handle, 1024);  
  274.         fclose($handle);  
  275.         if(strlen($contents)<=$headerLen){  
  276.             return -2;   
  277.         }  
  278.         //截掉文件头  
  279.         $contents=substr($contents,$headerLen);  
  280.           
  281.         //cache文件的分隔符为\A  
  282.         $pos=strpos($contentschr(0x0A));  
  283.         if($pos===FALSE){  
  284.             return -3;   
  285.         }  
  286.         //获取分隔符前的字符串  
  287.         $contents="http://".substr($contents,0,$pos);  
  288.         return $contents;  
  289. }  
  290. ?> 

测试

你可能感兴趣的:(批量清除nginx缓存的方法)