由于平台老是出现间歇性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的更多相关文章

  1. springboot2.0结合freemarker生成静态化页面

    目录 1. pom.xml配置 2. application.yml配置 3. 使用模板文件静态化 3.1 创建测试类,编写测试方法 3.2 使用模板字符串静态化 使用freemarker将页面生成h ...

  2. java 企业网站源码模版 有前后台 springmvc SSM 生成静态化

    java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 系统介绍 点击:获取地址 : 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态 ...

  3. java自适应响应式 企业网站源码 SSM freemaker生成静态化 手机 平板 PC springmvc

    java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 前台: 支持两套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用 ...

  4. java自适应响应式 企业网站源码 SSM 生成静态化 手机 平板 PC

    java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成ht ...

  5. java 企业网站源码模版 屏幕自适应 有前后台 springmvc SSM 生成静态化引擎

    前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...

  6. java 自适应响应式 网站 源码 SSM 生成 静态化 手机 平板 PC 企业站源码

    前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...

  7. java 企业 网站源码 模版 屏幕自适应 有前后台 springmvc SSM 生成静态化

    前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问 ...

  8. 利用PHP的ob函数实现生成静态化页面

    之前用过一些开源的CMS管理系统,当时就很好奇后台中的生成HTML静态文件是怎么实现的.今天和同事讨论了下,没想到同事之前做过这类的生成静态页面的功能,果断向他请教了下. 经他讲解后,才知道其实生成静 ...

  9. php 首页定时生成静态页面

    往往首页的js,商务通代码加的太多,导致页面访问速度变慢,可以把首页有动态变为静态进行访问,访问速度会有所提升,不过如果更新首页数据,并不能及时更新,而是你规定的时间内固定更新一次 代码如下: < ...

随机推荐

  1. Openstack的nova-network的vlan模式扩展

    openstack的nova-network的vlan模式是可以在安装的时候,将网络划分为多个子网,每个项目一个或者多个子网进行虚拟机创建.但是他现在代码级别上不支持:如果一开始安装的环境的vlan网 ...

  2. http错误码大全?

    响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行.响应码分五种类型,由它们的第一位数字表示:1.1xx:信息,请求收到,继续处理2.2xx:成功,行为被成功地接受.理解和采纳3 ...

  3. 浅谈 Scrapy 爬虫(二)

    越写越像官方文档的翻译,偏离了初衷.写一些官方文档里没有的内容吧.   在不限制宽带的环境下,根据页面的大小, Scrapy 一秒能爬取40-70个页面,一天在400万到600万页面.也就是说 Scr ...

  4. c++ 面试注意的问题

    1.输入数据合法性检查 2.变量命名 3.边界数据的检查 4.函数名,递归的思想[尤其是树.链表] 企业喜欢的人:聪明 努力 基础好 面试时不要主动请求提示,做题要大胆地想,及时与面试官沟通,防止想很 ...

  5. 3.vi 和软件安装

    vi编辑器全屏幕纯文本编辑器1.软件开发(程序编写) 2.配置文件修改以及系统服务调用模式 命令模式 插入模式 末行模式 a  追加    i 插入   o  打开(下一行) ESC shift+: ...

  6. C语言-《通讯录》

    黑白的通讯录 --1-- 需求分析 1.1 需求 1.2 原型展示 1.3 功能分析 --2-- 代码实现 2.1 外部声明.变量.宏 2.2 模块实现 ----------------------- ...

  7. 阻止iOS中页面弹性回滚,只允许div.phone_body的区块有弹性

    使用说明:只要替换选择器:var selector = '.phone_body'; /** * 阻止iOS中页面弹性回滚,只允许div.scroller的区块有弹性 */ (function () ...

  8. php 笔试题

    1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21 解:echo date(‘Y-m-d H:i:s’, strtotime(‘-1 day’)); 原因: format 字符说 ...

  9. Android 跑马灯

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  10. 自己动手写Logistic回归算法

    假设一个数据集有n个样本,每个样本有m个特征,样本标签y为{0, 1}. 数据集可表示为: 其中,x(ij)为第i个样本的第j个特征值,y(i)为第i个样本的标签. X矩阵左侧的1相当于回归方程的常数 ...