php生成静态页——实例版

http://www.phpx.com/happy/thread-92092-1-1.html

 

 

偶也来说说吧.
生成静态页的主要目的是什么? 提高效率.
在这里我以村子为例来说明我的构架, 请注意, 这个构架没有完全在村子使用.

-----------------------用户读帖子,存在静态页--------------A--------------
用户 :访问  http://www.phpx.com/happy/static/top92092.html
apache:  文件存在. 输出文件
用户 :得到页面


-----------------------用户读帖子,静态页未生成或已删除----B--------------
用户 : 访问  http://www.phpx.com/happy/static/top92092.html
apache:     文件不存在. 重定向到404处理程序 (httpd.conf加 ErrorDocument 404 /errprocess.php 指令)
errprocess.php: 得到用户请求的页面及各种变量. 是否需要进行生成静态的页面?
               首字母为: top ,是需要生成的页面,调用showthread.php (需改进结构将页面输出到变量$pagecontent)
               得到页面的内容$pagecontent, 将$pagecontent存成静态文件 top92092.html,
             最后可以:
               a) header("location:http://www.phpx.com/happy/static/top92092.html")
               b) header("HTTP/1.1 200 OK"); 以后 直接输出$pagecontent, 要注意img src等相对链接的位置了!!!
用户 : 得到页面 或者重定向到 A 操作.


-----------------------用户回帖子--------------------------C-------------
用户 : 回复帖子 top92092.html
newreply.php: 删除静态文件 top92092.html (如果用户信息也是生成静态js, 还要同时删除 用户id.js )
              数据入库等常规操作.
             最后可以:
               a) header("location:http://www.phpx.com/happy/static/top92092id.html")
               b) 或者改进 newreply.php 在入库后, 调用 showthread.php 得到页面的内容$pagecontent,
                  将$pagecontent存成静态文件 top92092.html, 输出$pagecontent;不过为了方法统一,
                  建议使用b)重定向只使用一个静态生成点.
用户 :用户得到页面 或 到B操作


-----------------------用户发表新帖------------------------D------------
用户 : 发表新帖子
newthread.php:  (如果用户信息也是生成静态js, 还要同时删除 用户id.js ) 数据入库等常规操作.
             最后可以:
               a) header("location:http://www.phpx.com/happy/static/top新帖id.html")
               b) 或者改进 newthread.php 在入库后, 调用 showthread.php 得到页面的内容$pagecontent,
                  将$pagecontent存成静态文件 top92092.html, 输出$pagecontent;不过为了方法统一,
                  建议使用b)重定向只使用一个静态生成点.
用户 :用户得到页面 或 到B操作

-----------------------村子更换html风格---------------------E---------
管理员: 删除  static 目录下的全部文件
用户访问页面, 页面不存在, 执行 B 操作


(
关键点:
1 不可以直接http://www.phpx.com/happy/top92092.html 这样其他设计的时候有问题

2 要注意文件位置, 比如 happy/images/a.gif 用户访问 happy/showthread.php时
代码写成 <img src=images/a.gif> 看到是对的. 而生成静态页后. 页面位置变成了
happy/static/top92092.html  这时图片的位置就不对了. 变成了 ../images/a.gif
所以showthread.php 写成 <image="/happy/images/a.gif"> 就不会有错了.
这当然会带来一些问题比如以后访问位置改成  www.phpx.com/bbs/ 那showthread.php代码
就需要修改了. 类似的还有很多, 比如javascript一类的.

3 帖子需要统计点击率, 怎么实现? 在生成文件时加代码 <img src=/happy/clicked.php?id=92092 width=1 height=1> ,由clicked.php 去更新点击数

4 用户信息, 如用户发贴数怎样保持最新? 用javascript
   a) 将用户信息部分改成 <script src=/happy/uinfo.php?uid=用户的id></script> 这样无论用户发贴数变化或者更新头像都是没有问题的
   b)用户信息也用其类似办法生成静态 <script src=/happy/static/用户的id.js></script>

5)一个目录下的文件过多就会有问题了.如果帖子量很大 ,全部指向 /happy/static/top帖子id.html
  不再是一个好的设计. 可以做变通处理 比如 /happy/static/版面id/top帖子id.html 将每个版面的
  帖子放置一个目录等. 类似的算法还很多.

6) 这种设计会提高效率么?
   我们来算算就知道了
   不采用以上结构. 一个帖子帖子有10个回复 和 100次浏览(简单计算, 不考虑帖子锁定, 用户权限等等)

   每次浏览 需选出帖子内容,选出每个帖子的用户信息(使用join操作) 更新点击数. 100*3 =300次 数据库查询
   每次回复 帖子入库 更新原帖回复数, 更新用户发贴数. 10*2 =20次 数据库查询

   也就是这个例子需要做 320次数据库查询. 而且其中在浏览时要将用户表 和 帖子表做join
这两个表通常会比较大.(如果不做join, 至少每次浏览加一次数据库查询. 因为帖子已经选出, 可以遍历获得全部发贴
   人的id, 再select ** where uid in (全部发帖人id) 获得这些人的信息 )   
   
   采用静态结构的情况:
   a) 用户信息动态   
   浏览: 有10个回复, 则被删除十次.
   生成10次静态文件, 需做需选出帖子内容,选出每个帖子的用户信息(使用join操作)操作: 10*2=20次
   100次浏览: clicked.php更新帖子点击数 100*1 =100 次 uinfo.php 获得信息  100*1 =100 次
   每次回复 帖子入库 更新原帖回复数, 更新用户发贴数. 10*2 =20次 数据库查询
   总共需要240次数据库查询

   b) 用户信息也静态
   浏览: 有10个回复, 则被删除十次.
   生成10次静态文件, 需做需选出帖子内容,选出每个帖子的用户信息(使用join操作)操作: 10*2=20次
   100次浏览: clicked.php更新帖子点击数 100*1 =100 次
   每次回复 帖子入库 更新原帖回复数, 更新用户发贴数.   10*2 =20次 数据库查询
                                     生成新的userid.js 10*1 =10次 数据库查询
   总共需要150次数据库查询

   对比, 前者需要320次查询, 其中100次为两个大表join .
   a) 需要240次数据库查询,10次大表join
   b) 需要150次数据库查询,10次大表join

   这里面还没有考虑调用 静态页 和 调用php的内存及cpu开销. 仅数据库一项差距就比较大了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值