php生成静态页面的办法
- 格式:doc
- 大小:54.50 KB
- 文档页数:7
浅谈动态与静态网页生成技术摘要:静态网页的访问速度要快于动态网页,使动态网页静态化具有重要意义。
由于动态网页要通过服务器端运行,这样增加了服务器的负载,使其静态化明显可以减轻服务器的压力,使网页访问速度加快。
使用静态更有利用搜索引擎的收录,提高网站的排名。
关键字:静态网页生成技术动态网页近几年来网站为了提高在搜索引擎中的排名想尽办法,其中最为常用的方法就是将动态网页静态化的处理方法。
一、动态网页与静态网页的比较静态网页是网页的代码都在页面中,不需要执行asp,php,jsp,.net等程序生成客户端网页代码的网页。
静态页面不能自主管理发布更新的页面,如果想更新网页内容,要通过ftp软件把文件down下来用网页制作软件修改(通过fso等技术例外)常见的静态页面举例:.html扩展名的、.htm扩展名的。
注意:静态页面并非网站上没有动画的就是静态页面。
动态网页是通过执行asp,php,jsp,.net等程序生成客户端网页代码网页。
动态页面通常可以通过网站后台管理系统对网站的内容进行更新管理。
发布新闻,发布公司产品,交流互动,博客,网上调查等,这都是动态网站的一些功能。
也是我们常见的。
动态页面常见扩展名有:.asp .php .jsp .cgi.aspx 等。
注意:动态页面的“动态”是网站与客户端用户互动的意思,而非网页上有动画的就是动态页面。
静态网页,动态网页主要根据网页制作的语言来区分:静态网页使用语言:html(超文本标记语言)动态网页使用语言:html+asp 或 html+php 或 html+jsp 等。
静态网页与动态的区别:程序是否在服务器端运行,是重要标志。
在服务器端运行的程序、网页、组件,属于动态网页,它们会随不同客户、不同时间,返回不同的网页,例如asp、php、jsp、、cgi等。
运行于客户端的程序、网页、插件、组件,属于静态网页,例如html页、flash、javascript、vbscript等等,它们是永远不变的。
Freemarker⽣成HTML静态页⾯这段时间的⼯作是做⼀个⽹址导航的项⽬,⾯向⽤户的就是⼀个⾸页,于是就想到了使⽤freemarker这个模板引擎来对⾸页静态化。
之前是⽤jsp实现,为了避免⽤户每次打开页⾯都查询⼀次数据库,所以使⽤了jsp的内置对象application,在Controller中将数据都查询出来,然后放⼊application,最后在JSP页⾯使⽤jstl标签配合EL表达式将数据遍历出来。
这样做是从⼀定程度上减轻了服务器的压⼒和页⾯的响应速度,但是仍然没有静态页⾯响应快。
使⽤Freemarker步骤:1. jar包,我的项⽬中使⽤maven来构建,所以在pom.xml中引⼊Freemarker jar包的坐标就可以了。
2. ftl模板,我在WEB-INF下⾯创建⼀个⽂件夹ftl,⾥⾯只放ftl模板⽂件,我创建了⼀个index.ftl⽂件。
3. ftl模板⽂件中写的就是html标签和css样式之类的,但是数据部分需要使⽤Freemarker提供的标签遍历出来。
如下<!--⼴告悬浮--><div class="subMenu"><!--⼯具--><div class='xff'><div class="slideTxtBox"><div class="hd"><span class="arrow"><a class="next"></a><a class="prev"></a></span><ul><#list newsMap?keys as testKey><li>${testKey}</li></#list></ul></div><div class="bd" style="padding: 5px 10px;"><#list newsMap?values as value><div style="text-align: left; table-layout: fixed; word-wrap: break-word; width: 100%;" class="baidu"><#list value as newsList><a target="_blank" href="${newsList.newsurl }" title="${newsList.newsname }">${newsList.newsname }</a></#list></div></#list></div></div></div></div>其中<#list></#list>是Freemarker提供的遍历标签,Freemarker提供了很多的标签,这⾥不⼀⼀叙述。
伪静态rewrite规则摘要:1.伪静态概念介绍2.伪静态rewrite 规则的作用3.伪静态rewrite 规则的编写方法4.伪静态rewrite 规则的实际应用5.伪静态rewrite 规则的优点与局限性正文:1.伪静态概念介绍伪静态(Pseudo Static)是一种在动态网页上实现静态页面效果的技术。
它允许在动态网页上使用静态页面的URL,从而提高网站的性能和用户体验。
伪静态技术通常用于PHP、Python 等编程语言,通过服务器端的代码实现动态内容与静态页面的结合。
2.伪静态rewrite 规则的作用伪静态rewrite 规则是实现伪静态技术的核心部分,它可以将动态网页的URL 重写为静态页面的格式。
这样,用户在访问网站时,浏览器会直接请求静态页面,而不是经过服务器的动态渲染。
这种技术可以有效地提高网站的访问速度,减轻服务器负担,同时方便搜索引擎的收录。
3.伪静态rewrite 规则的编写方法伪静态rewrite 规则通常通过服务器端的代码实现,以PHP 为例,可以使用PHP 的内置函数「rewrite」来实现。
以下是一个简单的伪静态rewrite规则示例:```php<?php// 判断是否为伪静态请求if (isset($_SERVER["HTTP_X_Rewrite_Url"])) {// 提取URL 中的参数$url_params = parse_str($_SERVER["HTTP_X_Rewrite_Url"], "/");// 根据参数构建动态SQL$sql = "SELECT * FROM content WHERE id=".$url_params["id"];// 执行SQL 获取动态内容$content = mysqli_query($sql);// 将动态内容输出到页面while ($row = mysqli_fetch_array($content)) {echo "【".$row["title"]."】".$row["content"]."<br>";}} else {// 输出静态页面内容echo "欢迎来到伪静态示例网站!";}>```4.伪静态rewrite 规则的实际应用在实际应用中,伪静态rewrite 规则可以根据网站的需求和结构进行灵活调整。
wordpress 全站生成静态html页面插件wordpress 全站生成静态html页面插件只要被浏览页面就会自动生成一个html页面文件名可以自己设,网上找的,分享下,说明:**** 概述****cos-html-cache 将会大大地提高你wordpress的运行效率和载入速度。
该插件会在页面第一次载入的时候产生和url对应的真正的html文件作为缓存,后面的运行将会直接载入该html从而大大的提高了页面的效率。
当页面内容发生变化时将会自动更新对应的页面,更新缓存的触发事件有:修改文章、删除文章、评论成功提交,同时这些事件也将会更新与之相邻的文章。
cos-html-cache2.0和之前的版本相比大大的提高了速度,改进了缓存的机制,使之更加科学**** 安装****1. 下载插件,解压缩,你将会看到一个文件夹cos-html-cache,请确认文件夹里面没有二级目录,然后将其放置到插件目录下,插件目录通常是 `wp-content/plugins/`;2. 在后台对应的插件管理页激活该插件;3 在网站的根目录下创建一个文件 "index.bak",并将属性设置成06664 安装完成;**** 卸载插件 ****1. 进入后台 admin->设置->cos-html-cache;2. 点击按钮删除所有的html缓存文件(请一定要删除);3. 删除首页根目录下的index.html(如果存在);4. 进入插件管理界面,禁用该插件;5. 卸载完成,若还有相关的html文件,请手动删除之。
**** FAQ ****1. 我后缀名是.htm不是.html的可以用么?后缀名是html或者html均可,其他方式不可以2. 如果我的永久连接是目录形式的可以用么?不可以,插件将会在目录下生成index.html文件。
3. 缓存的静态HTML文件在哪里?放在你URL链接对应的地方,比如你页面的地址是/dir1/dir2/2.ht ml那么静态文件就在 dir1/dir2 目录下4. 为什么后台没有批量更新了?请看最前面的说明,2.0的机制发生变化,已经不需要这个功能了!5. 如果我的永久连接不合理怎么办?放心修改就是,不用担心链接失效问题,我自己都修改过几次。
综合实例——“宝贝爱网站”制做指南2.1 创建站点在编辑网页之前,首先要定义一个站点,以下是高级模式的定义过程:[1] 启动Dreamweaver CS3软件,执行【站点】→【新建站点】菜单命令。
[2] 在【站点定义为】的对话框中选择“高级”选项卡,点击新建两个文件夹baby (根文件夹)和images(图像文件夹),如下图所示,设置“本地信息”的各个参数。
本例的主目录为baby,在信息服务默认站点EC中,“HTTP地址”为http://localhost/,其他默认,完成后点“确定”。
因为是静态网页,可以不设测试服务器。
[3] 将素材文件复制到baby文件夹下(含images文件夹和news.html文件)。
2.2 制作网页模板为便于理解,我们将网页模板的制作分为4小节,下面来看具体操作。
1.新建模板文档(1)选择【文件】→【新建】菜单,打开【新建文档】对话框。
单击“空模板”,在“模板类型”列表中选择“HTML模板”,默认“布局”为 <无>,最后单击“创建”按钮,如图2-1所示。
图2-1(2)按【Ctrl+S】组合键保存文档,弹出图2-2所示提示框,勾选“不再警告我”复选框,之后单击“确定”按钮。
图2-2(3)在打开的【另存模板】对话框中,从“站点”下拉列表中选择“宝贝爱”,在“另存为”文本框中输入模板文件名“ml”,最后单击“保存”按钮,如图2-3所示。
图2-3(4)按【Ctrl+J】组合键,打开【页面属性】对话框。
单击左侧“分类”列表中的“标题/编码”,设置标题为“宝贝爱网站”,其余默认,如图2-4所示。
图2-4(5)再次按【Ctrl+S】组合键保存文件(*养成习惯)。
2.设置模板内容(1) 单击【插入】面板【常用】栏中的“表格”按钮,在页面中插入一个1行2列,宽1000像素,边框粗细、单元格边距和间距均为0的表格,如图2-5所示。
图2-5在该表格【属性】面板中,设置“表格ID”为“1”(定义为表格1,参见图2-6底部提示标签<table#1>),“对齐”方式为“居中对齐”,如下图所示:(2)在表格1(table#1)的左右两个单元格中(用Ctrl+鼠标来选择定位,此方式以后会常用到)分别插入图片“in01.gif”和“index_02.gif”,如图2-6所示。
studyphp设置伪静态thinkphp规则
要在ThinkPHP中设置伪静态规则,您可以使用url助手函数和Url模型。
以下是一个示例规则,假设您的控制器名为Index,并且您希望将URL重写为以index/
开头的形式:
php
use think\Url;
// 定义伪静态规则
$rule = [
'Index/index' => 'index/index', // 首页
'Index/about' => 'index/about', // 关于我们页面
// 其他规则...
];
// 生成URL时使用伪静态规则
foreach ($rule as$key => $value) {
$url = Url::build($key, [], true); // 第三个参数设置为true表示使用伪静态规则
$rule[$url] = $value;
}
// 注册伪静态规则
\think\facade\Route::rule($rule)->name('index');
在上面的示例中,我们定义了一个$rule数组,其中键是原始URL的控制器和方法,值是对应的伪静态URL路径。
然后,我们使用Url::build()方法生成对应的URL,
并将结果作为新的键存储在$rule数组中。
最后,我们使用Route::rule()方法注册伪静态规则。
请注意,上述示例中的控制器名为Index,您可以根据实际情况进行修改。
此外,您可以根据需要添加更多的规则,只需在$rule数组中添加相应的键值对即可。
Thymeleaf实现页⾯静态化如果⽤户所有的请求,都需要Thyleaf渲染后直接返回给⽤户,后台就存在⼤量的查询操作,数据库的压⼒就会骤然上升,请求的时间就会延长,带来极不好⽤户体验,现在市⾯上流⾏的就是页⾯的静态化处理,下⾯就来看看,Thymeleaf如何完成页⾯静态化⼀. 什么是静态化?静态化就是我们把Thymeleaf渲染后的页⾯转变成静态页⾯,并且保存起来,⽤户每次访问的都是已经存在的静态页,数据库的查询压⼒也就⼩了,就⽐如商品详情页,只要商品的信息没有改变,⽆论是哪个⽤户查询的结果都是⼀样的,所以商品的详情页,完全可以静态化,事实上电商⽹站也是这样做的静态化的页⾯可以保存在nginx,这样做可以提升⼏个数量级的速度⼆ . 如何实现静态化?回顾⼀下前后端的交互顺序1. 前端提交请求2. 请求被springMVC收到了,调⽤持久层查库,把数据放⼊model3. Thymeleaf把model⾥⾯的数据渲染到模板视图⾥⾯XXX.html4. 把渲染后的全部信息,全部写⼊到response⾥⾯其实既然能写到response⾥⾯,就能写⼊到其他路径下,事实上,真的是这样做Thymeleaf如何把信息写⼊到response⾥?做这件事的是ThymeleafAutoConfiguration⾥⾯的TemplateEngine模板引擎使⽤下⾯的⽅法process(String template, IContext context, Writer writer)⽅法他是如何做的呢?新认识⼏个概念1 .Context 上下⽂这是块共享的空间,处理⽤户的请求时,各个servlet可以共享,事实上当我们把数据放⼊Model ,springMvc就会把model放⼊Context2. TemplateResolver 模板解析器@Beanpublic SpringResourceTemplateResolver defaultTemplateResolver() {SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();resolver.setApplicationContext(this.applicationContext);resolver.setPrefix(this.properties.getPrefix());resolver.setSuffix(this.properties.getSuffix());resolver.setTemplateMode(this.properties.getMode());if (this.properties.getEncoding() != null) {resolver.setCharacterEncoding(this.properties.getEncoding().name());}resolver.setCacheable(this.properties.isCache());Integer order = this.properties.getTemplateResolverOrder();if (order != null) {resolver.setOrder(order);}resolver.setCheckExistence(this.properties.isCheckTemplate());return resolver;}⽤来解析和读取配置⽂件,⾥⾯有我们的模拟的后缀以及路径,Thymeleaf的视图解析器依然是依赖它知道的配置信息有了Context和TemplateResolver万事具备,只差渲染了TemplateEngine调⽤process⽅法,模板引擎依靠context拿到数据,依靠templateResolver拿到配置信息,第三个参数是输出流,也就是我们的⽬标⽂件具体怎么撸?spring给我们准备好了!@AutowiredTemplateEngine templateEngine;/*** 构建静态化页⾯* @param id*/public void createHtml(Long id){// 1. 上下⽂Context context = new Context(); //thymeleaf包下的// 1.1 存⼊数据context.setVariables(loadModel(id));// 2 输出流File file = new File("Nginx所在虚拟机下的⽬标⽂件", id + ".html");try(PrintWriter writer = new PrintWriter(file,"UTF-8")){ //流在⼩括号⾥⾯会被⾃动的释放//⽣成HTMLtemplateEngine.process("1",context,writer);}catch (Exception e){log.error("静态页⽅法异常"+e);}}Nginx出场nginx的代理静态页⾯server {listen 80;server_name ;proxy_set_header X-Forwarded-Host $host;proxy_set_header X-Forwarded-Server $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;location /item {# 先找本地找root这个⽂件夹root html;if (!-f $request_filename) { #请求的⽂件不存在,就反向代理 request_filename是nginx的内置变量, 值是前段传递过来的id.html proxy_pass http://127.0.0.1:8084;break;}}location / {proxy_pass http://127.0.0.1:9002;proxy_connect_timeout 600;proxy_read_timeout 600;}}Rabbit出场使⽤Rabbit消息队列,可以第⼀时间了解什么啥时候更新静态页,啥时候创建新的静态页。
首先说原理。
某驼查了那么多资料,发现不管用什么方法,原理都是一样的。
就是用程序读取相应的数据来替换模版中的变量,然后生成静态页。
php中主要用到的就是要用到fread()和fwirte()。
而静态页面生成了之后,就会牵扯到修改的问题。
这里可以用到正则匹配的方法来替换模版中改变的部位。
不过此种方法太麻烦,驼驼推荐的方法是直接把原来生成的模版砍掉,重新生成,呵呵,真正的一了百了。
www~phperz~com还需要说明的一点就是,这种生成静态页面的方法一般都用于那些变化不是很频繁的页面,比如信息的最终页面。
而针对列表页,如果信息更新不是很频繁的话,也是可取的。
现在网上流行好多可以生成静态页面的blog或者论坛程序,都是通过手动点击后台“生成html页”的按钮来“半自动”生成html的。
而对一些信息量非常大的门户网站,则行不通。
因为静态页之所以叫“静态”,是因为其不可自动改变。
如果信息列表每天更新100次,那么静态的列表页就要重新生成100次。
如果我有10个这样的栏目,那想想也够吐血的了。
好了,闲话少说,现在来看看实际的程序演示:php程序员站first:是一个利用ob函数来做的咚咚,代码比较简单,效率相对也高一些。
某驼从某个www~phperz~com高人处得到的源码,做了一些改动php程序员站<?php ob_start();@readfile("http://localhost/?package=pricab&place_port=4");$text = ob_get_flush();$myfile = fopen("myfile.html","w");$text = str_replace ("{counent}",$string,$text);fwrite($myfile,$text);ob_clean();?>www~phperz~com因为就算要生成静态页面,动态读取那部分也是要保留的,把数据插入数据库后,把url传递给readfile函数,然后读入缓存,fwrite一下就可以生成静态页面,这个是驼驼最欣赏的一种作法。
代码行数最少,效率最高。
驼驼这边要求http://localhost/?package=pricab&place_port=4是一个裸页,也就是单纯的内容,没有头,尾,菜单。
这样才能比较自由的定制自己的模版myfile.html。
如果仅仅是要求生成静态页的话,ob_start();@readfile("http://localhost/?package=pricab&place_port=4");$string = ob_get_flush();$myfile = fopen("myfile.html","w");fwrite($myfile,$string);ob_clean();php程序员之家就可以over了php程序员之家second:普通生成静态html页。
这种作法就是按部就班的来做,fread进来页面,然后str_replace替换首先是创建最终内容页:php程序员之家$title = "测试模板";$file = "TwoMax Inter test templet,<br>author:[email=Matrix@Two_Max]Matrix@Two_Max[/email]";$fp = fopen ("temp.html","r");$content = fread ($fp,filesize ("temp.html"));$content = str_replace ("{file}",$file,$content);$content = str_replace ("{title}",$title,$content);$filename = "test/test.html";$handle = fopen ($filename,"w"); //打开文件指针,创建文件/* 检查文件是否被创建且可写*/ if (!is_writable ($filename)){ die ("文件:".$filename."不可写,请检查其属性后重试!"); }if (!fwrite ($handle,$content)){ //将信息写入文件die ("生成文件".$filename."失败!"); } www~phperz~comfclose ($handle); //关闭指针die ("创建文件".$filename."成功!"); 这一步比较简单。
只是单纯的变量替换即可。
如果要生成静态的列表页面的话,原理也是一样,用程序来生成文章列表,把它当成一个大的变量,替换模版中的变量,列表的翻页页是如此。
当然,如果有信息更新的话,列表翻页也是要重新生成的。
www~phperz~com<?php$title = "http://";$file = "TwoMax Inter test templet,<br>author:[email=Matrix@Two_Max]Matrix@Two_Max[/email]";$fp = fopen ("temp.html","r");$content = fread ($fp,filesize ("temp.html"));$content = str_replace ("{file}",$file,$content);$content = str_replace ("{title}",$title,$content);// 生成列表开始$list = '';$sql = "select id,title,filename from article";$query = mysql_query ($sql);while ($result = mysql_fetch_array ($query)){$list .= '<a href='.$root.$result['filename'].'target=_blank>'.$result['title'].'</a><br>'; } php程序员站$content .= str_replace ("{articletable}",$list,$content); //生成列表结束// echo $content;$filename = "test/test.html";$handle = fopen ($filename,"w"); //打开文件指针,创建文件/* 检查文件是否被创建且可写*/ if (!is_writable ($filename)){ die ("文件:".$filename."不可写,请检查其属性后重试!"); } if (!fwrite ($handle,$content)){ //将信息写入文件die ("生成文件".$filename."失败!"); } fclose ($handle); //关闭指针die ("创建文件".$filename."成功!"); ?> 关于翻页:如我们指定分页时,每页20篇。
某子频道列表内文章经数据库查询为45条,则,首先我们通过查询得到如下参数:1,总页数;2,每页篇数。
第二步,for ($i = 0; $i < allpages; $i++),页面元素获取,分析,文章生成,都在此循环中执行。
不同的是,die ("创建文件".$filename."成功!";这句去掉,放到循环后的显示,因为该语句将中止程序执行。
例:<?php $fp = fopen ("temp.html","r");$content = fread ($fp,filesize ("temp.html"));$onepage = '20';$sql = "select id from article where channel='$channelid'";$query = mysql_query ($sql);$num = mysql_num_rows ($query);$allpages = ceil ($num / $onepage);for ($i = 0;$i<$allpages; $i++){ if ($i == 0){ $indexpath = "index.html"; }else { $indexpath = "index_".$i."html"; }$start = $i * $onepage; $list = '';$sql_for_page = "select name,filename,title from article where channel='$channelid' limit $start,$onepage";$query_for_page = mysql_query ($sql_for_page);while ($result = $query_for_page){ $list .= '<a href='.$root.$result['filename'].'target=_blank>'.$title.'</a><br>'; }$content = str_replace ("{articletable}",$list,$content);if (is_file ($indexpath)){ @unlink ($indexpath); //若文件已存在,则删除} $handle = fopen ($indexpath,"w"); //打开文件指针,创建文件/*检查文件是否被创建且可写*/ if (!is_writable ($indexpath)){ echo "文件:".$indexpath."不可写,请检查其属性后重试!"; //修改为echo } if (!fwrite ($handle,$content)){ //将信息写入文件echo "生成文件".$indexpath."失败!"; //修改为echo } fclose ($handle); //关闭指针} fclose ($fp); die ("生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!");?>third:smarty模版生成静态页面驼驼是用smarty模版的,smarty自己有一个fetch函数,其功用有点类似于fread()可以用来生成静态的页面.这个例子大家想必看起来眼熟,对,smarty手册中关于fetch函数的例子,hoho 某驼借用一下,比竟官方的例子总是很经典的嘛!<?php include("Smarty.class.php");$smarty = new Smarty;$smarty->caching = true;// only do db calls if cache doesn't exist if(!$smarty->is_cached("index.tpl")) {// dummy up some data $address = "245 N 50th";$db_data = array("City" => "Lincoln","State" => "Nebraska", "Zip" => "68502");$smarty->assign("Name","Fred");$smarty->assign("Address",$address);$smarty->assign($db_data); }// capture the output $output = $smarty->fetch("index.tpl");//这个地方算是关键// do something with $output here echo $output; //hoho看到output的结果了吧然后呢?fwrite一下,我们就得到我们所要的结果了。