分布式Nginx缓存清理(PHP的socket编程)
最近,公司要使用康乐的几台自建CDN换成Nginx,在缓存配置上不会有很多的问题,纠结的问题是:Nginx的如何批量进行缓存清理
我们都知道Nginx提供了一个第三方的模块"nginx ngx_cache_purge",作为缓存清理的一个接口,进行Nginx缓存清理,但是这个接口只能基于url进行清理,这几乎是一个致命的缺点。
因为线上web应用:
1. url很多
2. 完全url我们几乎是不可能知道
3. 如果需要整站清理,那如果一个url,一个url清理,几乎是不可能完成的任务
为了有效清理Nginx缓存,我整理出了一个思路:
1. 在每台CDN上面跑一个清理缓存的daemon(这里我是使用php的socket编写的),原理就是删除缓存目录下的所有文件。
2. 使用一台控制机,这台控制机通过web的php页面,发送指令给CDN上的daemon,由daemon把CDN上面的所有缓存文件删除。
php_daemon.php
<?php
set_time_limit(0); $ip = '192.168.182.128';
$port = 10000;
if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {
echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n";
}
if(($ret = socket_bind($sock,$ip,$port)) < 0) {
echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n";
}
if(($ret = socket_listen($sock,4)) < 0) {
echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n";
}
include('cache_all.php');
do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
break;
} else {
$msg="测试成功!\n";
socket_write($msgsock, $msg, strlen($msg));
$buf = socket_read($msgsock,8192);
if ($buf == 'clear'){
delete_all('/home/cache');
} }
socket_close($msgsock);
}while (true);
?>
cache_all.php
function delete_all($dir)
{
$files=array();
$result=array();
if(is_dir($dir))
{
if($handle=opendir($dir))
{
while(($file=readdir($handle))!==false)
{
if($file!="." && $file!="..")
{
if(is_dir($dir."/".$file))
{
$files[$file]=delete_all($dir."/".$file);
}
else
{
$files[]=$dir."/".$file;
unlink($dir."/".$file);
}
}
}
closedir($handle);
}
}
}
使用php命令行,后台执行php_daemon.php: nohup /usr/local/webserver/php/bin/php php_daemon.php &
查看监听是否成功:netstat -nl |grep 10000
tcp 0 0 192.168.182.128:10000 0.0.0.0:* LISTEN #监听成功
web客户端代码:test.php
<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(E_ALL);
set_time_limit(0);
echo "<h2>TCP/IP Connection</h2>\n";
$port = 10000;
$ip = "192.168.182.128";
/*
+-------------------------------
* @socket连接整个过程
+-------------------------------
* @socket_create
* @socket_connect
* @socket_write
* @socket_read
* @socket_close
+--------------------------------
*/
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
}else {
echo "OK.\n";
}
echo "试图连接 '$ip' 端口 '$port'...\n";
$result = socket_connect($socket, $ip, $port);
if ($result < 0) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
}else {
echo "连接OK\n";
}
$in="clear";
if(!socket_write($socket, $in, strlen($in))) {
echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n";
}else {
echo "发送指令成功";
}
while($out = socket_read($socket, 8192)) {
echo "接收服务器回传信息成功!\n";
echo "接受的内容为:",$out;
} echo "关闭SOCKET...\n";
socket_close($socket);
echo "关闭OK\n";
?>
通过浏览器访问test.php:
连接成功,查看缓存目录,确定缓存是否清理完成...................
分布式Nginx缓存清理(PHP的socket编程)的更多相关文章
- 分布式FastDfs+nginx缓存高可用集群构建
介绍: FastDFS:开源的高性能分布式文件系统:主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡 FastDFS:角色:跟踪服务器(Tracker Server).存储服务器(St ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- Nginx实现负载均衡&Nginx缓存功能
一.Nginx是什么 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambl ...
- 十三python基础之socket编程
阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现 ...
- python学习------socket编程
一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...
- python基础之socket编程
一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 十 什么是 ...
- python基础之socket编程 (转自林海峰老师)
python基础之socket编程 阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...
- 分布式网格缓存Coherence简介
Coherence企业级缓存(一) 特点 摘要:Oracle Coherence是一个企业级的分布式集群缓存框架.具有自管理,自恢复,高可用性,高扩展性等优良特点,在电信BOSS等项目中有很大的应用价 ...
- 【原创】分布式之缓存击穿 【原创】自己动手实现静态资源服务器 【原创】自己动手实现JDK动态代理
[原创]分布式之缓存击穿 什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查 ...
随机推荐
- iOS开发 创建单例模式
+ (id)defaultNSObjectName { static id defaultNSObjectName = nil; static BOOL token = NO; if (!token) ...
- No resource found that matches the given name 'Theme.AppCompat.Light'
eclipse在新建andorid工程的时候出现找不到AppCompat.Light主题的问题,这是因为缺少支持低版本的v7包所致, 这个不是jar包,在sdk的extras->andorid- ...
- js倒计时天时分秒[转]
<script language="JavaScript"> <!-- // function getQueryString(name) { var reg =n ...
- 树 - 从零开始实现by C++
参考链接:数据结构探险之树篇
- grub4dos通用菜单及相关工具包
grub4dos通用菜单及相关工具包 全套工具包(含PE.ISO,可根据需要替换删减):http://pan.baidu.com/s/1i4EjWod模板文件3.3M(不含PE.ISO):http:/ ...
- 【转】 C++ map的基本操作和使用
1.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 2.map的功能 自 ...
- windows7系统配置maven环境
简介 maven的作用 1.通过在pom.xml配置的方式下载项目所需要的jar包 2.打jar包和打war包 1.环境配置 1.1 http://maven.apache.org/download ...
- 扒一扒JavaScript 预解释
带var关键字预解释 让我们先看下这段代码执行的结果: 代码如下: alert(n);//弹出undefinedvar n = 10; 弹出的结果是undefined,为何不是10?让我们再看下面这段 ...
- 倒计时原生js
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- hdu----(5053)the Sum of Cube(签到题,水体)
the Sum of Cube Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...