PHP生成静态页面--实例
- 格式:doc
- 大小:43.00 KB
- 文档页数:5
1.1 静态网页和动态网页的区别网页一般又称HTML 文件,是一种可以在WWW 上传输、能被浏览器认识和翻译成页面并显示出来的文件。
文字与图片是构成一个网页的两个最基本的元素,除此之外,网页的元素还包括动画、音乐、程序等。
网页是构成网站的基本元素,是承载各种网站应用的平台。
通常看到的网页,大都是以HTM 或HTML 后缀结尾的文件。
除此之外,网页文件还有以CGI 、ASP 、PHP 和JSP 后缀结尾的。
目前网页根据生成方式,大致可以分为静态网页和动态网页两种。
1.1.1 静态网页静态网页是网站建设初期经常采用的一种形式。
网站建设者把内容设计成静态网页,访问者只能被动地浏览网站建设者提供的网页内容。
其特点如下。
● 网页内容不会发生变化,除非网页设计者修改了网页的内容。
● 不能实现和浏览网页的用户之间的交互。
信息流向是单向的,即从服务器到浏览器。
服务器不能根据用户的选择调整返回给用户的内容。
静态网页的浏览过程如图1-1所示。
1.1.2 动态网页网络技术日新月异,许多网页文件扩展名不再只是.htm ,还有.php 、.asp 等,这些都是采用动态网页技术制作出来的。
动态网页其实就是建立在B/S 架构上的服务器端脚本程序。
在浏览器端显示的网页是服务器端程序运行的结果。
静态网页与动态网页的区别在于Web 服务器对它们的处理方式不同。
当Web 服务器接收到对静态网页的请求时,服务器直接将该页发送给客户浏览器,不进行任何处理。
如果接收到对动态网页的请求,则从Web 服务器中找到该文件,并将它传递给一个称为应用程序服务器的特殊软件扩展,由它负责解释和执行网页,将执行后的结果传递给客户浏览器。
如图1-2所示为动态网页的工作原理图。
动态网页的一般特点如下。
● 动态网页以数据库技术为基础,可以大大降低网站维护的工作量。
● 采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、搜索查询、用户管理、订单管理等。
ASP生成静态Html网页的几种方法网页生成静态Html文件有许多好处,比如生成html网页有利于被搜索引擎收录,不仅被收录的快还收录的全.前台脱离了数据访问,减轻对数据库访问的压力,加快网页打开速度. 所以吟清最近对生成html比较感兴趣,看了不少文章,也有一点点收获.1,下面这个例子直接利用FSO把html代码写入到文件中然后生成.html格式的文件<%filename="test.htm"if request("body")<>"" thenset fso = Server.CreateObject("Scripting.FileSystemObject") set htmlwrite = fso.CreateTextFile(server.mappath(""&filename&"")) htmlwrite.write "<html><head><title>" & request.form("title") & "</title></head>"htmlwrite.write "<body>输出Title内容: " & request.form("title") & "<br /> 输出Body内容:" & request.form("body")& "</body></html>"htmlwrite.closeset fout=nothingset fso=nothingend if%><form name="form" method="post" action=""><input name="title" value="Title" size=26><br><textarea name="body">Body</textarea><br><br><input type="submit" name="Submit" value="生成html"> </form>2、但是按照上面的方法生成html文件非常不方便,第二种方法就是利用模板技术,将模板中特殊代码的值替换为从表单或是数据库字段中接受过来的值,完成模板功能;将最终替换过的所有模板代码生成HTML文件.这种技术采用得比较多,大部分的CMS都是使用这类方法.template.htm ' //模板文件<html><head><title>$title$ by </title></head><body>$body$</body></html> ?TestTemplate.asp '// 生成Html <%Dim fso,htmlwriteDim strTitle,strContent,strOut'// 创建文件系统对象Set fso=Server.CreateObject("Scripting.FileSystemObject") '// 打开网页模板文件,读取模板内容Sethtmlwrite=fso.OpenTextFile(Server.MapPath("Template.htm")) strOut=f.ReadAllhtmlwrite.closestrTitle="生成的网页标题"strC'// 用真实内容替换模板中的标记strOut=Replace(strOut,"$title$",strTitle)strOut=Replace(strOut,"$body$",strContent)'// 创建要生成的静态页Sethtmlwrite=fso.CreateTextFile(Server.MapPath("test.htm"),true) '// 写入网页内容htmlwrite.WriteLine strOuthtmlwrite.closeResponse.Write "生成静态页成功!"'// 释放文件系统对象set htmlwrite=Nothingset fso=Nothing%>3、第三种方法就是用XMLHTTP获取动态页生成的HTML内容,再用ADODB.Stream或者Scripting.FileSystemObject保存成html 文件。
php开发案例PHP开发案例。
PHP(Hypertext Preprocessor)是一种开源的通用脚本语言,特别适用于Web开发并可嵌入HTML中使用。
它的语法借鉴了C、Java和Perl,易于学习和使用。
PHP被广泛应用于服务器端脚本编程,是目前Web开发中最受欢迎的编程语言之一。
在本文中,我们将介绍一些PHP开发案例,展示其在实际项目中的应用。
1. 网站开发。
PHP最常见的用途之一是网站开发。
通过PHP,开发者可以轻松地创建动态网页、处理表单数据、连接数据库等。
例如,一个简单的博客网站可以使用PHP来实现用户注册登录、发表文章、评论等功能。
PHP与MySQL等数据库的结合使用,可以实现网站数据的动态展示与管理,极大地提高了网站的交互性和实用性。
2. 电子商务平台。
在电子商务领域,PHP也有着广泛的应用。
许多知名的电子商务平台,如Magento、WooCommerce等,都是基于PHP开发的。
通过PHP,开发者可以实现商品展示、购物车管理、订单处理等功能,为用户提供便捷的在线购物体验。
同时,PHP的开源特性也为电子商务平台的定制开发提供了便利,开发者可以根据客户的需求进行个性化定制,满足不同行业的电商需求。
3. 社交网络。
社交网络是当今互联网领域中最热门的应用之一,而PHP正是许多社交网络平台的首选开发语言。
通过PHP,开发者可以实现用户注册、个人资料管理、消息互动、好友关系等功能。
同时,PHP的快速开发特性也使得社交网络平台可以及时跟进用户需求,不断推出新功能和改进,保持平台的活力和吸引力。
4. 内容管理系统。
许多网站需要一个灵活、易用的内容管理系统(CMS)来管理网站内容。
PHP的灵活性和可扩展性使得它成为了许多知名CMS的首选开发语言,如WordPress、Joomla等。
通过PHP,开发者可以实现文章发布、页面管理、插件扩展等功能,为网站管理员提供便捷的内容管理工具,使得网站的更新和维护变得简单高效。
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提供了很多的标签,这⾥不⼀⼀叙述。
如何为大型网站提速:1.静态化2.缓存技术memcache3.Mysql优化瓶颈:带宽,数据库访问提出问题->引出新技术->小案例->细节->使用到项目中三个重要概念:1.静态网站http://localhost/test.html2.动态网址http://localhost/showNews.php?id=2&title=test搜索引擎不喜欢3.伪静态网址传统做法:http://localhost/showNews.php?lang=cn&class=2&id=100这种网址不好,SEO不好, SQL注入攻击危险改成伪静态网址:不要过于精简http://localhost/news-cn-class2-id100.html补充说明:SEO 搜索引擎优化页面静态化概念:在实际开发中通常使用缓存技术或页面静态化来解决页面静态化分为:1.真静态:把php -> html访问时不操作数据库2.伪静态:只是把网址静态(访问数据库)页面静态化的必要性:1.访问PHP的速度一般比html慢ab.exe可以用来测试网站访问速度( 压力测试),该工具可以模拟多人并发访问某个页面ab.exe -n 10000 -c 10 http://localhost/test.php-n:请求多少次-c:表示多少人并发访问2.利于搜索引擎优化URL长度,静态页参数,meta信息,图片alt信息,frame信息(尽量不要使用框架) 3.防止SQL注入缓存机制不用总访问数据库使用php缓存机制完成页面静态化如果要测试php自己的缓存机制,需要做配置php.ini中:display_errors=Onoutput_buffering=Offerror_reporting=设置错误级别<?php//开启缓存[可以通过php.ini, 也可以通过ob_start()]ob_start();echo "yyy";header("content-type:text/html;charset=utf-8");echo "hello";//ob_clean() 可以清空output_buffering内容ob_clean();//ob_end_clean()关闭output_buffering缓存,同时清空其中内容ob_end_clean();//ob_flush()函数是把output_buffering内容输出,清空ob_flush();//ob_end_flush()函数是把output_buffering内容输出,清空并关闭ob_end_flush();echo "kkk"; // => 程序缓存(内容必须放在header()后面)//ob_get_contents()可以获取output_buffering内容//$contents=ob_get_contents();//file_put_contents("d:/log.txt", $contents);?>flush()函数是刷新程序缓存的内容补充:php header()函数定义和用法header() 函数向客户端发送原始的HTTP报头。
JSP生成静态HTML页面的几种方法2008年04月12日星期六 09:26一、从数据库中取相应数据并替换掉模板中的对应标签,下面是一个简单的示例1.buildhtml.jsp<%@ page contentType="text/html; charset=gb2312"import="java.util.*,java.io.*"%><%try{String title="This is Title";String content="This is Content Area";String editer="LaoMao";String filePath = "";filePath = request.getRealPath("/")+"test/template.htm";//out.print(filePath+"<br>");String templateContent="";FileInputStream fileinputstream = new FileInputStream(filePath);//读取模块文件int lenght = fileinputstream.available();byte bytes[] = new byte[lenght];fileinputstream.read(bytes);fileinputstream.close();templateContent = new String(bytes);//out.print(templateContent);templateContent=templateContent.replaceAll("###title###",title); templateContent=templateContent.replaceAll("###content###",content); templateContent=templateContent.replaceAll("###author###",editer);//替换掉模块中相应的地方//out.print(templateContent);// 根据时间得文件名Calendar calendar = Calendar.getInstance();String fileame = String.valueOf(calendar.getTimeInMillis()) +".html"; fileame = request.getRealPath("/")+fileame;//生成的html文件保存路径FileOutputStream fileoutputstream = new FileOutputStream(fileame);//建立文件输出流byte tag_bytes[] = templateContent.getBytes();fileoutputstream.write(tag_bytes);fileoutputstream.close();}catch(Exception e){out.print(e.toString());}%>2. template.htm<html><head><title>###title###</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <LINK href="../css.css" rel=stylesheet type=text/css></head><body><table width="500" border="0" align="center" cellpadding="0" cellspacing="2"><tr><td align="center">###title###</td></tr><tr><td align="center">author:###author### </td></tr><tr><td>###content###</td></tr></table></body></html>=======================================================二、从动态页的URL获取相应页面内容并写入到文件/** Created on 2006-3-4* To change the template for this generated file go to* Window>Preferences>Java>Code Generation>Code and Comments */package .tools.utils;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import .HttpURLConnection;import .URL;import java.util.Date;/*** @author Administrator* To change the template for this generated type comment go to* Window>Preferences>Java>Code Generation>Code and Comments */public class MakeHtml {private static long star = 0;private static long end = 0;private static long ttime = 0;//返回html代码public static String getHtmlCode(String httpUrl){Date before = new Date();star = before.getTime();String htmlCode = "";try {InputStream in;URL url = new .URL(httpUrl);HttpURLConnection connection =(HttpURLConnection)url.openConnection();connection = (HttpURLConnection) url.openConnection();connection.setRequestProperty("User-Agent","Mozilla/4.0"); connection.connect();in = connection.getInputStream();java.io.BufferedReader breader = new BufferedReader(new InputStreamReader(in , "GBK"));String currentLine;while((currentLine=breader.readLine())!=null){htmlCode+=currentLine;}} catch (Exception e) {e.printStackTrace();}finally{Date after = new Date();end = after.getTime();ttime = end-star ;System.out.println("执行时间:"+ttime +"秒");}return htmlCode;}//存储文件public static synchronized void writeHtml(StringfilePath,String info,String flag) {PrintWriter pw = null;try {File writeFile = new File(filePath);boolean isExit = writeFile.exists();if (isExit != true) {writeFile.createNewFile();} else {if (!flag.equals("NO")) {writeFile.delete();writeFile.createNewFile();}}pw = new PrintWriter(new FileOutputStream(filePath, true)); pw.println(info);pw.close();} catch (Exception ex) {System.out.println(ex.getMessage());}finally{pw.close();}}public static void main(String[] args) {String url = "/index.htm";writeHtml("c:/demo.htm",getHtmlCode(url),"NO");}}三、利用Filter和定制Response,把服务器返回的JSP响应输出到我们自己的Response中,就可以将响应快速写入Html文件,然后再发送给客户。
看到很多朋友在各个地方发帖问PHP生成静态文章系统的方法,以前曾做过这样一个系统,遂谈些看法,以供各位参考。
好了,我们先回顾一些基本的概念。
一,PHP脚本与动态页面。
PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合,也可以类,函数封装等形式,以模板的方式对用户请求进行处理。
无论以何种方式,它的基本原理是这样的。
由客户端提出请求,请求某一页面----->WEB服务器引入指定相应脚本进行处理----->脚本被载入服务器----->由服务器指定的PHP解析器对脚本进行解析形成HTML语言形式---->将解析后的HTML语句以包的方式传回给浏览器。
由此不难看出,在页面发送到浏览器后,PHP就不存在了,已被转化解析为HTML语句。
客户请求为一动态文件,事实上并没有真正的文件存在在那里,是PHP解析而成相对应的页面,然后发送回浏览器。
这种页面处理方式被称为“动态页面”。
二,静态页面。
静态页面是指在服务器端确实存在的仅含HTML以及JS,CSS等客户端运行脚本的页面。
它的处理方式是。
由客户端提出请求,请求某一页面---->WEB服务器确认并载入某一页面---->WEB服务器将该页面以包的形式传递回浏览器。
由这一过程,我们对比一下动态页面,即可方现。
动态页面需由WEB服务器的PHP解析器进行解析,而且通常还需连接数据库,进行数据库存取操作,然后才能形成HTML语言信息包;而静态页面,无须解析,无须连接数据库,直接发送,可大大减轻服务器压力,提高服务器负载能力,大幅提供页面打开速度和网站整体打开速度。
但其缺点是,不能动态地对请求进行处理,服务器上必须确实存在该文件。
三,模板及模板解析。
模板即尚未填充内容html文件。
例如:temp.html<HTML><TITLE>{ title}</TITLE><BODY>this is a { file} file's templets</BODY></HTML>PHP处理:templetest.php<?php$title = "网页教学网测试模板";$file= "Webjx test templet,<br>author:web@";$fp= fopen ("temp.html","r");$content= fread ($fp,filesize ("temp.html"));$content .= str_replace ("{ file}",$file,$content);$content .= str_replace ("{ title}",$title,$content);echo $content;?>模板解析处理,即将经PHP脚本解析处理后得出的结果填充(content)进模板的处理过程。
通常借助于模板类。
目前较流行的模板解析类有phplib,smarty,fastsmarty等等。
模板解析处理的原理通常为替换。
也有些程序员习惯将判断,循环等处理放进模板文件中,用解析类处理,典型应用为block概念,简单来说即为一个循环处理。
由PHP脚本指定循环次数,如何循环代入等,再由模板解析类具体实施这些操作。
好了,对比过静态页面与动态页面各自的优劣,现在我们就来说说,如何用PHP生成静态文件。
PHP生成静态页面并不是指PHP的动态解析,输出HTML页面,而是指用PHP创建HTML 页面。
同时因为HTML的不可写性,我们创建的HTML若有修改,则需删掉重新生成即可。
(当然你也可以选择用正则进行修改,但个人认为那样做倒不如删掉重新生成来得快捷,有些得不偿失。
)言归正传。
用过PHP文件操作函数的PHP FANS知道,PHP中有一个文件操作函数fopen,即打开文件。
若文件不存在,则尝试创建。
这即是PHP可以用来创建HTML文件的理论基础。
只要用来存放HTML文件的文件夹有写权限(即权限定义0777),即可创建文件。
(针对UNIX 系统而言,Win系统无须考虑。
)仍以上例为例,若我们修改最后一句,并指定在test目录下生成一个名为test.html的静态文件:<?php$title = "网页教学网测试模板";$file= "Webjx test templet,<br>author:web@";$fp= fopen ("temp.html","r");$content= fread ($fp,filesize ("temp.html"));$content .= str_replace ("{ file}",$file,$content);$content .= str_replace ("{ title}",$title,$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."成功!");?>实际应用中常见问题解决方案参考:一,文章列表问题:在数据库中创建字段,记录文件名,每生成一个文件,将自动生成的文件名存入数据库,对于推荐文章,只需指向存放静态文件的指定文件夹中的该页面即可。
利用PHP操作处理文章列表,存为字符串,生成页面时替换此字符串即可。
如,在页面中放置文章列表的表格加入标记{ articletable},而在PHP处理文件中:<?php$title = "网页教学网测试模板";$file= "Webjx test templet,<br>author:web@";$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>';}$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 ("生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!");?>大致思路如此,其中如其它数据生成,数据输入输出检查,分页内容指向等可酌情在页面中加入。