首页自动生成静态化html
由于平台老是出现间歇性502。排查发现,php死进程过多耗费大量系统资源。
除了优化代码之外,静态化可以减少php进程。缓解一下服务器压力。
把首页生成html后,出现问题频率下降。所以需要做首页静态化,并自动按规定时间更新。
1,在模板引入生成脚本,k的值随便定,只是为了防止没参数时,直接访问脚本static.php的触发。
<script type="text/javascript" src="/static.php?k=XXXXXX"></script>
2,脚本
$k = trim($_GET['k']);
if (!is_string($k) || strlen($k) < 32 || $k !== md5("XXXXX")) {
return false;
}
//首页1分钟更新一次
if (!file_exists("index.html") || time() - filemtime("index.html") > 60) {
create_html();
} //生成静态
function create_html()
{
//开启output buffer 缓冲区,如果php已经开启,则不需要。
// php.ini 中,output_buffering = 4096
// if (!ini_get('output_buffering')) {
ob_start();
// }
//调用模板组织成页面
require "index.php";
//获取缓冲区中的页面,并清除缓冲区
$content = ob_get_clean();
//将页面保存成为静态文件
$s=file_put_contents("index.html", $content);
if($s){
echo $s;
}else{
echo 0;
}
}
如果写入失败,考虑写入权限问题 chmod -R 777 XXX
出现问题:
1,因为首页上面有登陆后,出现欢迎你,XXX的,东西,会出现,登陆用户如果更新缓存会把这些字符给抓下来,写入index.html
屏蔽ob缓存,采用file_get_content或者curl,或者用了ob之后phpquery来处理文档也可以。
2,超时问题
如果本身由于各种问题,index.php访问过慢。有可能会写入失败或者不完整。做了3套方案。
并且做了超时,和内容长度判断
以下是修改后代码
<?php
/**
* 静态化
* User: lee
* Date: 2015/12/7
* Time: 17:40
*/
//自定义验证
$k = trim($_GET['k']);
if (!is_string($k) || strlen($k) < 32 || $k !== md5("XXX")) {
die('{"status":0,"info":"k is error"}');
}
//首页1分钟更新一次
if (!file_exists("index.html") || time() - filemtime("index.html") > 60) {
//刷新缓存
ob_flush();
flush();
$obj = new StaticPage();
$obj->create_html();
} else {
die('{"status":0,"info":"file exists"}');
} //静态类
class StaticPage
{
//生成静态
public function create_html()
{
$ob = json_decode($this->P(1), 1);//优先ob缓存
if ($ob['status'] == 0) {
$file_get_content = json_decode($this->P(2), 1);
//失败,采用http
if ($file_get_content['status'] == 0) {
//采用curl
$curl = json_decode($this->P(3), 1);
if ($curl['status'] == 0) {
die('{"status":0,"info":"server error"}');
} else {
echo json_encode($curl);
}
} else {
echo json_encode($file_get_content);
}
} else {
echo json_encode($ob);
} } /**
* http get请求
* @param string $url
* @param mixed $param
* @param int $time
* @return mixed
*/
private function httpGet($url, $param = null, $time = 1000)
{
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//不验证证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//不验证host
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 500);//设置时间
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_NOSIGNAL, 1); //注意,毫秒超时一定要设置这个
curl_setopt($ch, CURLOPT_TIMEOUT_MS, $time);
//curl_setopt($ch, CURLOPT_TIMEOUT, $time);//设置时间
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不直接输出
// grab URL and pass it to the browser
$result = curl_exec($ch);
if (curl_errno($ch)) {
//echo 'Errno2'.curl_error($ch);//捕抓异常
return false;
}
// close cURL resource, and free up system resources
curl_close($ch);
return $result;
} /**
* 获取页面
*/
private function P($type = 1)
{
$url = "http://" . $_SERVER['HTTP_HOST'] . "/index.php";
//ob缓存
if ($type == 1) {
//由于首页有登陆状态,使用ob缓存会记录登陆者名字进入缓存文件。
// if (!ini_get('output_buffering')) {
ob_start();
// }
require "index.php";
$content = ob_get_clean();
//把登陆欢迎信息替换,不能缓存用户名,phpQuery是一个dom处理的类,详细可以看我另外的文章 http://www.cnblogs.com/findgor/p/4955321.html
require "../App/Common/phpQuery.php";
phpQuery::newDocument($content);
$str = <<<STR
<a href="http://{$_SERVER['HTTP_HOST']}/XXXXX" rel="nofollow">立即登录</a>
<a href="http://{$_SERVER['HTTP_HOST']}/XXXXX" style="background:#A3A3A3;font-size:16px;font-weight:bold;color:#fff;" rel="nofollow">免费注册</a>
<a href="http://{$_SERVER['HTTP_HOST']}/XXXX/" style="color:#cccccc">帮助中心</a>|
<a href="http://{$_SERVER['HTTP_HOST']}/XXXX/" style="color:#cccccc" rel="nofollow">关于我们</a>|
<a href="XXXXX" style="color:#cccccc" rel="nofollow">VIP中心</a>
STR;
pq("#head #head_nav .right")->html($str);
$dom = pq()->html();
return $this->W($dom, 1);
}
//file_get_contents
if ($type == 2) {
$opts = array(
'http' => array(
'method' => "GET",
'timeout' => 1, //设置超时
)
);
$context = stream_context_create($opts);
$content = @file_get_contents($url, false, $context);
return $this->W($content, 2);
}
//curl
if ($type == 3) {
$content = $this->httpGet($url);
return $this->W($content, 3);
}
} /**
* 写入
* @param null $content 数据
* @param int $type 类型
* @return json
*/
private function W($content = null, $type = 1)
{
//大于1W字符写入
if (strlen($content) > 10000) {
$index = @file_put_contents("index.html", $content);
if ($index) {
return json_encode(array("status" => 1, "data" => $index, "info" => "write ok!", "type" => $type));
} else {
return json_encode(array("status" => 0, "data" => $index, "info" => "write false!", "type" => $type));
}
} else {
return json_encode(array("data" => 0, "info" => "<10000", "type" => $type));
}
}
} ?>
===================
考虑到其他页面的静态化。有2种想法
1,同样在这个static.php脚本里面触发,增加批量检测更新
2,后台按钮手动触发。
这两种方式那种最好。待我测试之后再行更新此文章。
补充:
过了2年了,再看这篇文章,技术显然不太符合现在的开发规范。目前采用的是redis缓存,所有首页数据都存到redis里面,定时cron更新
目标都是减少数据库开销,而redis是基于内存的,比磁盘读写速度要快,比较符合当前的开发概念。
参考:http://blog.csdn.net/jetxt/article/details/44563145#0-tsina-1-16123-397232819ff9a47a7b7e80a40613cfe1
首页自动生成静态化html的更多相关文章
- springboot2.0结合freemarker生成静态化页面
目录 1. pom.xml配置 2. application.yml配置 3. 使用模板文件静态化 3.1 创建测试类,编写测试方法 3.2 使用模板字符串静态化 使用freemarker将页面生成h ...
- java 企业网站源码模版 有前后台 springmvc SSM 生成静态化
java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 系统介绍 点击:获取地址 : 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态 ...
- java自适应响应式 企业网站源码 SSM freemaker生成静态化 手机 平板 PC springmvc
java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 前台: 支持两套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用 ...
- java自适应响应式 企业网站源码 SSM 生成静态化 手机 平板 PC
java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成ht ...
- java 企业网站源码模版 屏幕自适应 有前后台 springmvc SSM 生成静态化引擎
前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...
- java 自适应响应式 网站 源码 SSM 生成 静态化 手机 平板 PC 企业站源码
前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...
- java 企业 网站源码 模版 屏幕自适应 有前后台 springmvc SSM 生成静态化
前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...
- 利用PHP的ob函数实现生成静态化页面
之前用过一些开源的CMS管理系统,当时就很好奇后台中的生成HTML静态文件是怎么实现的.今天和同事讨论了下,没想到同事之前做过这类的生成静态页面的功能,果断向他请教了下. 经他讲解后,才知道其实生成静 ...
- php 首页定时生成静态页面
往往首页的js,商务通代码加的太多,导致页面访问速度变慢,可以把首页有动态变为静态进行访问,访问速度会有所提升,不过如果更新首页数据,并不能及时更新,而是你规定的时间内固定更新一次 代码如下: < ...
随机推荐
- 响应式内容滑动插件jQuery.bxSlider
bxSlider特性 1.充分响应各种设备,适应各种屏幕: 2.支持多种滑动模式,水平.垂直以及淡入淡出效果: 3.支持图片.视频以及任意html内容: 4.支持触摸滑动: 5.支持Firefox,C ...
- AngularJs的UI组件ui-Bootstrap
http://www.cnblogs.com/pilixiami/p/5597634.html
- Card Flip
卡牌效果:O(∩_∩)O,只做了webkit浏览器的效果,请用chrome~ 1.首先呢,先用一个框框把卡牌包住,然后呢,搞两个子元素作为卡牌正反面.当然咯,反面是看不见滴~ <section ...
- Weblogic的架构
WebLogic管理控制台 WebLogic服务器提供了一个健壮的基于Web 的工具——管理控制台,它是执行上述任务的主要工具.通过管理控制台,你可以访问WebLogic管理服务.管理服务实现了 S ...
- linux sed
sed 命令 sed -i 's/3306/3308/g' my.cnf mysql # 同时替换两个文件
- Linux中profile、bashrc、bash_profile之间的区别和联系
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置. 英文描述为: # /etc/pr ...
- JDK的安装与Java环境变量的配置详解
JDK作为JAVA开发的环境,必须在电脑上安装JDK. 1.下载jdk http://rj.baidu.com/soft/detail/14459.html?ald下载jdk最新版jdk-8u11-w ...
- Java SE 基础:常用关键字
Java SE 基础:常用关键字 常用关键字表
- [转]DataURL与File,Blob,canvas对象之间的互相转换的Javascript
来源 http://blog.csdn.net/cuixiping/article/details/45932793 canvas转换为dataURL (从canvas获取dataURL) var d ...
- jquery.validate使用 - 自定义错误信息
自定义错误消息的显示方式 默认情况下,验证提示信息用label元素来显示, 并且会添加css class, 通过css可以很方便设置出错控件以及错误信息的显示方式. /* 输入控件验证出错*/form ...