维护一套网站系统,由于时间久远,已不知道他的静态化系统要如何开启和如何运做,而首页及部分频道页由于查询太多,致使运行缓慢,急需一种简单有效的方法来提升访问效率。php
由于问题主要出在页面中内容的查询上,优化方法天然是要减小或杜绝查询,在不动网站系统代码的前提下,可经过 Apache 的 URLRewrite 来达到目的。数据库
创建一个目录(如 cache)来存放静态化后页面文件,在网站根目录的 .htaccess 中写入规则, 没有就建立一个:apache
RewriteCond %{DOCUMENT_ROOT}/cache/%{REQUEST_URI}.cache -f RewriteRule ^(.*)$ cache/$1.cache [L]
此规则判断 cache 目录下是否存在当前 URI 对应的 .cache 后缀的文件, 若是有则将请求定向到该文件. 可是网站页面自己已采用了 URLRewrite 将 url 映射到了程序脚本上, 而其路径规则可能对尾部的 "/" 不敏感, 如 /abc/def 与 /abc/def/ 能够是同一个页面, RewriteCond 并不支持字符串截取、正则替换等操做, 故另添加如下规则来匹配 "/" 结尾的缓存:缓存
RewriteCond %{DOCUMENT_ROOT}/cache/%{REQUEST_URI}/.cache -f RewriteRule ^(.*)$ cache/$1/.cache [L]
如今, 咱们还须要一个简单脚原本将页面输出存入缓存文件中, 可编写一个 bash 脚原本实现:bash
#!/bin/bash WD=$(cd `dirname $0`; pwd) cache () { ln="$1" fn="$WD/$1.cache" tn="$WD/$1.cachx" dn=`dirname $fn` rm -f "$fn" rm -f "$tn" mkdir -p "$dn" wget -O "$tn" "http://www.xxx.com/$ln" mv "$tn" "$fn" } if [ "@" != "$1" ] then cache "$1" else cache "" cache xxx/ cache xxx/xxx fi
可见脚本中 wget 将输出存入了临时文件后改名为目标文件, 这是由于 wget 在执行开始时就会打开文件, 此时请求开始, apache 因文件存在而重定向, 最后拿到的文件就成空的了. 为减小网络请求时间, 可在 /etc/hosts 中加入 127.0.0.1 www.xxx.com网络
此脚本使用方法为:优化
./cache.sh # 缓存首页 ./cache.sh xxx/ # 缓存 xxx 频道页(网站内连接可能用 / 结尾) ./cache.sh xxx/xxx # 缓存 xxx 文章页(网站内连接不会用 / 结尾) ./cache.sh @ # 缓存全部常常访问的页面(脚本 else 部分)
能够把常常访问的页面加入脚本 else 部分, 将此脚本设为计划任务, 每隔一段时间刷新缓存一次, 能有效减小请求对数据库的查询次数.网站
但这还不够, 编辑可能须要在发布文章后当即更新缓存, 以便查看首页、频道页等位置的新闻、推荐等是否正确. 可采用如下 PHP 脚原本执行(若是网站系统是 PHP 编写):url
<?php $URIS = array( '', 'xxx/', 'xxx/xxx', ); if (isset($_GET['n'])) { if (!in_array($_GET['n'], $URIS)) { exit('Wrong request'); } $uri = $_GET['n']; } else { $uri = '@'; } echo "<pre>\r\n"; system(__DIR__.'/cache.sh \''.$uri.'\' 2>&1'); echo "</pre>\r\n";
只需在须要刷新缓存时请求 /cache/cache.php 便可, 可经过 n 参数来指定仅刷新哪一个页面. 为防止恶意利用此脚本执行危险命令(如: abc'; rm -rf 'xxx), 以上判断了仅能刷新指定的页面; 固然文件更名或加上密码等措施可能更可靠些.code