分布式Nginx缓存清理(PHP的socket编程)

时间:2022-09-08 21:11:26

最近,公司要使用康乐的几台自建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编程)

连接成功,查看缓存目录,确定缓存是否清理完成...................

分布式Nginx缓存清理(PHP的socket编程)的更多相关文章

  1. 分布式FastDfs&plus;nginx缓存高可用集群构建

    介绍: FastDFS:开源的高性能分布式文件系统:主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡 FastDFS:角色:跟踪服务器(Tracker Server).存储服务器(St ...

  2. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  3. Nginx实现负载均衡&amp&semi;Nginx缓存功能

    一.Nginx是什么 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambl ...

  4. 十三python基础之socket编程

      阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现 ...

  5. python学习------socket编程

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

  6. python基础之socket编程

    一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 十 什么是 ...

  7. python基础之socket编程 (转自林海峰老师)

    python基础之socket编程   阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 ...

  8. 分布式网格缓存Coherence简介

    Coherence企业级缓存(一) 特点 摘要:Oracle Coherence是一个企业级的分布式集群缓存框架.具有自管理,自恢复,高可用性,高扩展性等优良特点,在电信BOSS等项目中有很大的应用价 ...

  9. 【原创】分布式之缓存击穿 【原创】自己动手实现静态资源服务器 【原创】自己动手实现JDK动态代理

    [原创]分布式之缓存击穿   什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查 ...

随机推荐

  1. this(C&num; 参考)

    原文地址:https://msdn.microsoft.com/zh-cn/library/dk1507sz.aspx this 关键字引用类的当前实例,还可用作扩展方法的第一个参数的修饰符. 注意 ...

  2. python之input&lpar;&rpar;&comma; raw&lowbar;input&lpar;&rpar;

    input(): 要求输入合法的python表达式, 例如字串需要加"", 四则运算会自动计算. raw_input():所有输入视作字串 >>> val=inp ...

  3. hdu1391&lpar;Number Steps &rpar;

    Problem Description Starting from point (0,0) on a plane, we have written all non-negative integers ...

  4. C&plus;&plus; Primer中文本查询演示样例Query的实现

    近期在看C++ Primer复习C++的语法,看到书中15.9章中的文本查询演示样例时,认为设计得非常不错,于是便动手照着实现了一个,改动了非常久最终执行成功了,从中也学习到了非常多的语法.以下把实现 ...

  5. 输出一个string的所有排列情况

    问题: 1.加入输入是{a,b,c}; 2.输出abc,acb,bac,bca,cab,cba; 代码描述: 1.递归遍历所有情况 2.方法FUN输入为:要排列的字符串char inp[];inp[] ...

  6. 数据库 mysql 语句

    LAMP: Linux系统 A阿帕奇服务器 Mysql数据库 Php语言 mysql:常用代码 create table CeShi1( Uid varchar(50) primary key, Pw ...

  7. Django应用部署 - 上线指南

    http://blog.csdn.net/pipisorry/article/details/46957613 python manage.py runserver已经很接近于服务器的形式,但是并不能 ...

  8. &lbrack;Swift&rsqb;LeetCode729&period; 我的日程安排表 I &vert; My Calendar I

    Implement a MyCalendar class to store your events. A new event can be added if adding the event will ...

  9. Docker 安装以及运用

    Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上.Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位.系统内核版 ...

  10. 深入理解JavaScript的事件循环(Event Loop)

    一.什么是事件循环 JS的代码执行是基于一种事件循环的机制,之所以称作事件循环,MDN给出的解释为 因为它经常被用于类似如下的方式来实现 while (queue.waitForMessage()) ...