php平滑重启nginx,彻底清除WordPress的静态缓存 | 张戈博客

  • 时间:
  • 浏览:38
  • 来源:洛叶资源网 - 专注共享简约博客资源

每一次分享技术文章,都在基于当事人的痛点,基于当事人的需求。这次也一样,太少分享具体辦法 可是我,我先说一下我这次的需求与痛点:

一、需求痛点

在博客集成了代码版缓存功能可是我,为了方便在前台清理页面缓存,我特意写了ajax清理缓存的功能(相关文章)。你什儿 功能写好可是我不言而喻都也能 正常工作。

可是我 ,为了让网站加载速率提升到极致,我还在nginx里边加了类似于于WP Super Cache的mod_rewrite机制:当地处页面缓存时,会绕过PHP解析,而直接调取缓地处前台展示。

那可是我你发现了俩个 疑问:当我在前台点击缓存清理后,后台的页面缓存文件不言而喻是删除了,可是我 nginx却在内存里边缓存了一份!!从而原应一段时间内怎样才能会刷新页面,展示的依然是缓存内容!那我一来,不管是我还是用户,点击前台你什儿 清理按钮根本就只有实时看多效果,明显就鸡肋了!

我发现你什儿 疑问的做法是,点击按钮删除缓存,可是我 进入Linux系统去reload一下nginx,也能彻底刷新缓存!我勒个去,每次我调试代码的可是我,真心能把人累死(不言而喻帮我关闭缓存功能,可是我 我太少我要享受一下当事人写的清理功能嘛!)。

需求都在了,怎能让技术成为瓶颈?

太少,根据以上需求,很容易得出俩个 处里方案:当点击前台清理按钮时,php先删除缓存文件,可是我 reload平滑重启nginx就都也能 实现彻底清除缓存了!

测试了半天,发现难点是php怎样才能也能执行Linux命令。经过不断测试,终于背熟你什儿 疑问,下面刚开始了了分享!

二、执行权限

php执行Linux命令有几块前提条件:

①、php还要开放太少执行外部命令的函数,比如exec()、system()等;

②、还要赋予WEB启动帐号(比如www帐号)执行特殊命令(比如 …/nginx -s reload)的权限。

对于疑问 ①:

i. 修改php配置文件php.ini,先找到safe_mode配置,确认safe_mode=off,即关闭php安全模式(lnmp一键安装包默认原应是关闭的了);

ii. 继续找到disable_functions配置,将其中的 exec 删除,即允许执行exec()函数;

ii. 最后重载php-fpm或php即可生效,比如lnmp环境都也能 执行 service php-fpm reload命令。

Ps:开启exec函数地处被恶意注入的风险,不过我你什儿 小博客就没那此好惧怕的,况且我的备份及防护都很完善!

对于疑问②:

大伙儿儿还要在Linux中赋予WEB帐号使用sudo执行指定命令的权限,在你什儿 需求中,大伙儿儿都也能 那我做:

#编辑/etc/sudoers文件:
vim /etc/sudoers

#找到 Defaults    requiretty,并注释掉:
#Defaults    requiretty

#接着在文件最后打上去一行允许www帐号以root身份无密码执行reload nginx的命令:
www ALL=(root) NOPASSWD:/usr/local/nginx/sbin/nginx -s reload

#最后按下ESC退出编辑模式,键入 :x! 或 :wp! 强行保存并退出vim即可。

Ps:操作vim还要一定的Linux基础知识,不必的童鞋先脑补一下吧!

三、部署代码

①、新增平滑重启nginx的脚本

#在Linux的opt目录新增reload_nginx.sh脚本:

[[email protected]_Server ~]# vim /opt/reload_nginx.sh 
#脚本内容(注意nginx的实际路径):
#!/bin/bash
/usr/bin/sudo /usr/local/nginx/sbin/nginx -s reload

#保存脚本后,赋读取和执行权限:
chmod +xr /opt/reload_nginx.sh

②、PHP代码

php执行你什儿 脚本的代码很简单:

<?php exec(EscapeShellCmd("/opt/reload_nginx.sh")); ?>

Ps:实际上,使用 exec(/opt/reload_nginx.sh””) ; 也是完整篇 都也能 的。多套了一层EscapeShellCmd是为了安全考虑(不言而喻这里貌似没啥必要,是否掩耳盗铃吧!)。

既然知道php代码了,这样了假若修改上次分享的缓存清理代码,如下新增26行和33行即可:

<?php
//缓存清理代码(实际使用,请自行修改缓存路径!)
if(isset($_POST['action'])){
    if($_POST['action'] == 'delcache'){
        if($_POST['page_type'] == 'single'){
            $post = $_POST['post_id'];
            $cachefile = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post.".html/index.html";
            $cachedir = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post.".html";
        } else if($_POST['page_type'] == 'page') {
            $post = $_POST['slug'];
            $cachefile = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post."/index.html";
            $cachedir = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post;
        } else if($_POST['page_type'] == 'category') {
            $post = $_POST['slug'];
            $cachefile = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post."/index.html";
            $cachedir = "/home/wwwroot/zhang.ge/cache/zhang.ge/".$post;
        } else if($_POST['page_type'] == 'home') { 
            $cachefile = "/home/wwwroot/zhang.ge/cache/zhang.ge/index.html";
        } else {
            exit();
        }
        if($_POST['page_type'] == 'home'){
            if (file_exists($cachefile)) {
                unlink($cachefile);
                //删除缓存后平滑重启nginx:
                exec(EscapeShellCmd("/opt/reload_nginx.sh"));
            }
        } else if($_POST['page_type'] != 'null') {
            if (file_exists($cachefile)) {
                unlink($cachefile);
                rmdir($cachedir);
                //删除缓存后平滑重启nginx:
                exec(EscapeShellCmd("/opt/reload_nginx.sh"));
            }
        } else {
           exit(); 
        }
    }
    exit();
}
?>

Ps:若对以上代码有任何疑问,请务必参考上一篇相关文章。

完整篇 完成可是我,现在在前台使用缓存清理功能,原应先删除缓存文件,可是我 平滑重启nginx,从而真正实现在纯静态的前台实时清理缓存,显示最新内容!

四、写在最后

这篇教程是否我你什儿 强迫症&发骚友学习实验之作,可是我 整个教程并未太少考虑安全疑问。太少,原应都在和我你什儿 既这样了意被人攻击,又清楚个中原理的人,还是不建议做你什儿 强迫症设置(实际上也太少我解禁了exec函数地处隐患而已)!

总之,这篇文章分享的方案,还是有一定的参考价值的,根据本文思路,就都也能 实现在WEB界面任意操作服务器了,不言而喻也就和大每段站长用的Linux系统面板差太少,希望能给有还要的人提供太少参考,有任何相关疑问记得给我留言。