PHP生成静态页面详解

web应用 发表评论

PHP生成静态页面详解 作者:晓凯
  看到很多朋友在各个地方发帖问PHP生成静态文章系统的方法,以前曾做过这样一个系统,遂谈些看法,以供各位参考。好了,我们先回顾一些基本的概念。

  一,PHP脚本与动态页面。

  PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合,也可以类,函数封装等形式,以模板的方式对用户请求进行处理。无论以何种方式,它的基本原理是这样的。由客户端提出请求,请求某一页面 —–> WEB服务器引入指定相应脚本进行处理 —–> 脚本被载入服务器 —–> 由服务器指定的PHP解析器对脚本进行解析形成HTML语言形式 —-> 将解析后的HTML语句以包的方式传回给浏览器。由此不难看出,在页面发送到浏览器后,PHP就不存在了,已被转化解析为HTML语句。客户请求为一动态文件,事实上并没有真正的文件存在在那里,是PHP解析而成相对应的页面,然后发送回浏览器。这种页面处理方式被称为“动态页面”。

  二,静态页面。

  静态页面是指在服务器端确实存在的仅含HTML以及JS,CSS等客户端运行脚本的页面。它的处理方式是。由客户端提出请求,请求某一页面 —-> WEB服务器确认并载入某一页面 —-> WEB服务器将该页面以包的形式传递回浏览器。由这一过程,我们对比一下动态页面,即可方现。动态页面需由WEB服务器的PHP解析器进行解析,而且通常还需连接数据库,进行数据库存取操作,然后才能形成HTML语言信息包;而静态页面,无须解析,无须连接数据库,直接发送,可大大减轻服务器压力,提高服务器负载能力,大幅提供页面打开速度和网站整体打开速度。但其缺点是,不能动态地对请求进行处理,服务器上必须确实存在该文件。

  三,模板及模板解析。

  模板即尚未填充内容html文件。例如:
  三,模板及模板解析。

  模板即尚未填充内容html文件。例如:

 

 temp.html
  Code:   
<HTML>
  <TITLE>{ title }</TITLE>
  <BODY>
     this is a { file } file’s templets
  </BODY>
</HTML>
 
PHP处理:

 templetest.php
  Code:  
<?php
  $title = “拓迈国际测试模板”;
  $file   = “TwoMax Inter test templet,<br>author:Matrix@Two_Max“;

 $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的静态文件:
  Code:   
<?php
   $title = “拓迈国际测试模板”;
   $file   = “TwoMax Inter test templet,<br>author:Matrix@Two_Max“;

 $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处理文件中:
  Code:  
<?php
   $title = “拓迈国际测试模板”;
   $file   = “TwoMax Inter test templet,<br>author:Matrix@Two_Max“;

 $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.”成功!”;这句去掉,放到循环后的显示,因为该语句将中止程序执行。例:
  Code:   
<?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 (”生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!”);

?>
 
  大致思路如此,其中如其它数据生成,数据输入输出检查,分页内容指向等可酌情在页面中加入。

  在实际文章系统处理过程当中,还有许多问题有待考虑,与动态页面不同之处,需注意的地方还有很多。但大致思路即是如此,其它方面可举一反三而得。

  另:仓促完成(待续),不足之处还请高手指正。

  注:该文档为"晓凯"原创。

固定链接:PHP生成静态页面详解 |Add to Google       129 views

天才的乔布斯,伟大的iphone

web应用, 操作系统, 无线手机 发表评论

 李开复博士在2008年讲的最多的是谷歌的“云计算”,李开复曾说过 “未来是数据跟着你走,你买了一台新的机器,不用担心把数据拷过来或装新的应用软件,一个浏览器一切的环境、内容、信息全部在你面前了。当然这不止是在PC上,未来用手机、电视或其他的也可以接触这样的信息。未来你在任何时候、任何设备可以看到你所有的信息、做你所有的应用,都经过一个浏览器。”

  而天才的乔老爷带领他的苹果军团造出了很“云”的iphone,iphone应该算是云计算的实践者和先驱了,iphone除了苹果惯有的美感外,更重要的是通过一个手机终端把用户带上了云端,在移动互联网的天空中划出美丽的云朵。下面是techcrunch的创始人阿灵顿演示iphone在手机终端和电脑间分享数据(datacase-数据箱)的视频。

  时像开放facebook可以赚钱那样,开发iphone软件也是可以赚钱的,在如此短的时间里,iphone就成为了一个移动互联网最好的操作系统,而且形成了一个相对开放的产业链。当然,apple公司会每年开wwdc开发者会议,这意味着什么?我不回答,你来想象。

  开发者是一个非常大的群体,而且已经很细分,iphone软件开发者将成为一个可能热门的职业,移动互联网软件市场也是大市场,而且不需要太久就会剧烈膨胀,开发者们,你们准备好了吗?

固定链接:天才的乔布斯,伟大的iphone |Add to Google       130 views

MT(Movable Type)不属于我们的时代了

web2.0酷站, web应用, 程序、代码 3 条评论

N年前,我觉得MT真他妈cool,一定要装个,当时没银子,所以放弃了,现在买了美国空间可以装了,下载、解压,我靠:居然20多m,是wordpress2.5的5倍大小!

作为一个博客程序,MT已经不属于我们了,尤其是个人博客,也许他们的多用户会好一些,perl写的程序也许离web远一些,或者躲在系统的背后,wordpress这样轻量级的博客程序才是王道。

wordpress打败MT,开源是关键 ,基于开源的构架让全世界程序员和爱好者参与了进来,在增加了用户的同时,增加了产品丰富性和个性化,而facebook也在这么干,国内也开始学着这么干了。

同样的事情在国内也上演,戴志康的discuz开源差点让竞争对手死掉,市场份额接近垄断,当然开源免费了,垄断法不管,哈哈。

 

固定链接:MT(Movable Type)不属于我们的时代了 |Add to Google       188 views

wordpress2.6版本终于不用插件可以加图片、视频、音频了

web应用, 程序、代码 6 条评论

wordpress的编辑器一直不太方便,这么多版本,直到2.6版本才完成了不用插件插入图、视频、音频。不管怎么说是个大好消息,以后我的wordpress博客可以放视频了哦。

从左到右依次是图片、视频、音频、媒体,以后在wordpress博客里就很容易嵌入youtube、tudou、youku等视频啦。

固定链接:wordpress2.6版本终于不用插件可以加图片、视频、音频了 |Add to Google       275 views

站在sns边缘的博客媒体

web2.0酷站, web应用, 社交网络 2 条评论

最近几个月it圈子的sns非常火爆,尤其是tw同事录和5gsns的推出,几乎一夜之间改变了这么多blogger的媒体习惯,在sns里泡的时间越来越多,而原来的博客被置于墙角,那么是否意味着sns彻底颠覆博客媒体价值呢?

关键词:博客媒体、sns、精英、草根、web2.0

第一点:sns会让大众博客走向衰落

这个是必然现象,在it圈子这个现象提前上演,很多自己写博客的人去了sns,因为sns里内置着博客的功能,同时,好友的回复评论也是很紧密的,这个比博客要强很多,所以sns是比博客更能让草根享用话语权的地方。

当然,中国的sns还没有强大到让博客压抑的地步,门户博客依然有较高使用率,sns要想颠覆门户博客还是很难的,当然这只是个时间问题,门户自己也在sns化,不过挑战性较大。

sns要草根有个观众和读者,这一点很重要,基于此会产生认同和反馈,从而形成互动。

第二点:博客媒体会越来越高端和专业化

博客的自媒体趋势越来越明显,专家博客和专业博客会更有读者群,而普通的博客则走进sns里,笔者认为这是好事。毕竟写有价值的博客内容的人还是很少数的,走精英化道路会好一些,也给网民省点心。

独立博客会越来越多,这是一种进步。当然博客盈利这个说法本身有问题,博客是个人日志,别老说盈利了,盈利会毁掉博客,正因为不盈利它才有价值。当然,如果博客发展到techcrunch那样,也是会盈利的,我们要说的是:博客不是用来盈利的。

方兴东当年是走高端、草根两条线,不过是从高端开始,最后被新浪博客抄家了,笔者倒是觉得sns会让高端博客的媒体价值更加凸显,新浪博客sns了,wordpress也在sns,笔者期待是大范围的社区,而不是一个局域网。

第三点:sns的秩序和文化

这两点对于sns是非常重要的,如果不建好这两点,sns和通用的博客系统、bbs没有太本质的超越。keso以前提过圈子之死的说法,sns是圈子,要活着,就不能没有秩序和文化,否则会像被不规则的信息流冲散sns的关系。

秩序和文化就像什么呢?像我们社会的道德和法律,法律是秩序,道德是文化,没有良好的文化的社会是没有未来的。尤其对于专业领域的sns,要考虑本专业的文化和需求,这样更容易获得稳定的发展和认可。

最后还是要加一句:sns需要活跃度,是绝对不是pv越高就越好。

固定链接:站在sns边缘的博客媒体 |Add to Google       236 views

把你的twitter评论加到你的博客、网站等的方法

web应用 发表评论

这是一个英国人开发的小程序,为了大家使用方便我把安装方法翻译过来,如下:

A部分:下载并设置

1、到项目站点下Chirrup程序包,下载地址:http://chirrup.angryamoeba.co.uk/download.html

2、解压程序包到本地一个临时目录下

3、打开config文件夹下chirrup_config.php文件,并且更改设置,主要是设置你的twitter帐号的用户名(username)和密码(password).

B部分:上传并设置

1、根据你的主机结构上传Chirrup,到你想放的位置。Chirrup将运行在你的站点的子域名下或子文件夹下,并记住你放置chirrup的位置。以chirrup.liuhuafang.com为例,下面告诉大家怎么操作。

2、如果您用的是apache,那么chirrup目录自带.htaccess文件,.htaccess文件里有正则规则来阻止别人偷窥你的xml缓存。如果你不是用apache,你需要自己设置。(别怕,大多数还是apache)

C部分:调用代码,加到您的网站里

wordpress编辑器太垃圾,总是乱过滤 ,调用代码我放在txt里

http://liuhuafang.com/pic/chirrup.txt

固定链接:把你的twitter评论加到你的博客、网站等的方法 |Add to Google       244 views

谷歌onebox的意义

web2.0酷站, web应用, 搜索引擎 5 条评论

端午节假期看到很多网友在讨论谷歌的onebox搜索。其实,onebox概念的全能搜索早在去年就被提出来了,当时李开复提出的全能搜索就是现在谷歌的onebox搜索效果,而中国雅虎则是另一种表达形式,当然,实事求是地说谷歌的onebox很有意义。

搜索结果的表达方式对于整个互联网发展有重要影响,尤其是基于互联网的新媒体,谷歌的onebox对重要关键词产生新样式的搜索结果,这个结果通过算法结合了新闻搜索、网页搜索、博客搜索,立体地展示了互联网不同维度的意见或知识。

 onebox对新媒体的价值

如果说谷歌的pr体系是网页重要度衡量标准的话,那么onebox则一定程度上是新媒体价值的衡量标准,尤其是对 博客来说,博客的新媒体价值在搜索引擎上得到了肯定。博客是新媒体的一个维度,目前这个维度还是比较迷茫的,onebox把博客提升到搜索结果页面重要位置,可以说是博客的有一次革命,这一次革命是为了新媒体,而不再是单纯日志,onebox会促进产生一大批基于blog的social media。

谷歌onebox会是一个坐标

onebox博客模块加到通用搜索里面,使得谷歌中文自身的新媒体属性大大增强,onebox后面的算法更加复杂,不过对于普通网民而言,onebox给了他们从新闻、网页、博客等不同维度进行信息或事件的处理。

中国没有technorati,也许谷歌的onebox博客模块会起到technorati的一些作用,从而进一步给博客和social media一个参考标准,进而催生一个健康的博客生态链。

固定链接:谷歌onebox的意义 |Add to Google       593 views

圈子之死与IM之开放

web应用, 社交网络, 软件硬件 发表评论

IM正在走向统一、整合、开放,尽管腾讯还是因垄断地位而自我封闭,但是sns的发展和twitter等新应用的流行已经改变了趋势。业内一些人士如洪波提出圈子之死的说法,不过没有说出原因,今天笔者略带解析圈子之死和IM的一些新的发展方向,希望对相关人士有所帮助。

圈子之死:目前sns正在流行,而作为sns雏形的圈子却趋于死寂。

圈子是博客时代走向sns时代的一个过渡产品,当过渡产品并非没有价值,只是在一定时期不处于主导价值,圈子在出现不久就变成了另类的论坛,信息组织很简单,关系组织很简单,甚至没有多少关系。当圈子、群组人数控制在少范围的时候,圈子变得专注所以有效,这时候圈子对于成员是有价值的;而当圈子人数不断攀升的时候,圈子因为关系匮乏和噪音过大而不可管理,成员们的交互管理失效,于是圈子死了。

IM之开放:IM互联互通已成趋势

最先让人关注的是雅虎微软两家im的互通,而现在IM已经非常多,而且大多基于开放协议,比如gtalk,国外很多IM基于jabber开放程序创建,而最近雅虎刚出来的最新版yahoo! messenger 9.0可以导入msn、gmail、myspace、aol、web.de、riddif等二十多项目全球各国的流行IM、通讯录数据。

下面是yahoo最新IM的解说视频:

 

 

http://us.i1.yimg.com/us.yimg.com/i/us/msg/9/sp/maxwell_b2_20080528.swf
   sns和im相互支持、相互消长。腾讯在国内IM领域基本上处于垄断地位,不过也有一点不好:QQ群很高的比例是被用户屏蔽的。QQ群影响了大家的工作和上网,以至于百度im推出后的群功能一出生就是残废,而圈子之死也与QQ群带来的噪声污染有关,当然不是主要因素。facebook有自己的im工具,国内的校内也有自己的校内通,而新浪则在测试新浪魔方,IM多地让我笔记本内存不足了,开放与整合不可避免。

 雅虎Messenger最新版的开放性让人看到Jerry的社区理念的一些影子,9.0甚至可以自定义去掉IM上的雅虎搜索,大量实用功能通过插件方式实现,交给用户自己选择,从而实现了个性化和社区化。雅虎这种新思路是代表一种新方向,新浪魔方也在尝试插件方式,未来这种模式必然是趋势,即使是腾讯也逃不过。

 

固定链接:圈子之死与IM之开放 |Add to Google       367 views

wordpress获取rss内容的函数wp_rss、fetch_rss

web应用 发表评论

Description

Retrieves an RSS feed and parses it. Uses the MagpieRSS and RSSCache functions for parsing and automatic caching and the Snoopy HTTP client for the actual retrieval.

Usage

 <?php
include_once(ABSPATH WPINC ‘/rss.php’);
$rss fetch_rss($uri);
?> 

Example

To get and display a list of links for an existing RSS feed, limiting the selection to the most recent 5 items:


<h2><?php _e(‘Headlines from AP News’); ?></h2>
<?php // Get RSS Feed(s)
include_once(ABSPATH WPINC ‘/rss.php’);
$rss fetch_rss(http://example.com/rss/feed/goes/here’);
$maxitems 5;
$items array_slice($rss->items0$maxitems);
?>

<ul>
<?php if (empty($items)) echo ‘<li>No items</li>’;
else
foreach ( 
$items as $item ) : ?>
<li><a href=’<?php echo $item['link']; ?>‘ 
title=’<?php echo $item['title']; ?>‘>
<?php echo $item['title']; ?>
</a></li>
<?php endforeach; ?>
</ul>

Parameters

$uri
(URI) (required) The URI of the RSS feed you want to retrieve. The resulting parsed feed is returned, with the more interesting and useful bits in the items array.
Default: Nonerray.

Description

Retrieves an RSS feed and parses it, then displays it as an unordered list of links. Uses the MagpieRSS and RSSCache functions for parsing and automatic caching and the Snoopy HTTP client for the actual retrieval.

Usage

<?php
include_once(ABSPATH WPINC ‘/rss-functions.php’);
wp_rss($uri$num);
?> 

Example

To get and display a list of 5 links from an existing RSS feed:

<?php 
include_once(ABSPATH WPINC ‘/rss-functions.php’);
wp_rss(http://example.com/rss/feed/goes/here’5);
?>

Parameters

$uri
(URI) (required) The URI of the RSS feed you want to retrieve. The resulting parsed feed is returned, with the more interesting and useful bits in the items array.
Default: None
$num
(integer) (required) The number of items to display.
Default: None

Output

The output will look like the following:

<ul>
<li>
<a href=’LINK FROM FEED’ title=’DESCRIPTION FROM FEED’>TITLE FROM FEED</a>
</li>
(repeat for number of links specified)
</ul>

固定链接:wordpress获取rss内容的函数wp_rss、fetch_rss |Add to Google       260 views

站点换素装代码

web应用 1 条评论

全站CSS代码。

html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); }
固定链接:站点换素装代码 |Add to Google       376 views