免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2659 | 回复: 0
打印 上一主题 下一主题

LB论坛效率低下的根本症结及解决方法(我最近学习Perl的成果) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-22 21:08 |只看该作者 |倒序浏览
本贴在LB5000的3个所谓官方论坛《LB技术版》张出后,竟无人应对。
因我以前曾在此版学到了不少东西,望在这儿的各位大师不吝指教,指出哪儿还存在问题,我会虚心学习的。




声明:此文纯粹属于技术性讨论文章,不存在任何贬损含义,因为我自己也仍然在用LB论坛。其实本文也可以作为在编写其它cgi程序时,如何提高效率的参考。

发文目的:
    1、大家应正视这样一个事实:因为速度的原因,放弃LB换用支持数据库的php、asp脚本论坛程序的越来越多。经过1个多月对Perl语言、LB论坛和dvbbs、phpbb、ib、ibb、ubb、vbb、discuz、ibf-php等其它流行论坛程序的研究分析,我把LB改写思路公开出来,供LB作者和其它cgi程序爱好者参考,也希望能有一个高效的cgi脚本论坛程序,给大家永远免费使用。
    2、我上个月在《海捷在线》发布了要推出HJBB论坛的消息,得到了很多朋友的信任和支持,本人非常感动并表示感谢。但由于本人已十年没写程序了,Perl语言以前也没认真研究过,最近又急需要写一个自用的商业程序(系统分析已基本完成),实在没有时间改写LB,在此向朋友们道歉:对不起大家,让你们失望了!(不过,如果我的“网上订货及进销存”程序完成后,还没有其它朋友推出类似程序,我还会继续的,具体日期我也不知道了,呵呵~~)

---------------------------------------------

          LB论坛效率低下的根本症结及解决方法
(作者:海捷  来自:《海捷在线》 http://Hi-Gi.com  日期:2003.03.16)

一、LB采用普通文本方式存储数据,其数据结构设计不合理,太多不必要的文件(有一些可以合并),频繁以加解锁方式读写大量文件,由于“加锁”和“解锁”本身也需要读写文件,所以读写数据文件1次,实际需要进行3次文件检测和读写;同时由于LB数据文件采用.cgi类型存储,为避免出现安全问题,还要对用户提交的数据进行过滤处理。
    解决方法:
    自创一种专门用于论坛的文本型数据库结构,减少文件数,提高查找速度,提高数据处理程序的通用性。
    1、把表相关描述信息放入第一行(信息之间以制表符\t和&分隔):字段名称及最大长度、删除标记、未删除记录总数、删除记录总数、自动添加数据用的计数器、某些字段的统计数据,数据不能相同的主键名称、所关联的其它数据表名称及字段名称。再设定一个跟特定论坛或帖子有关信息的字段(如帖子最后ID号lastnum等),此字段内的多个数据用特殊符号&隔开。(此部分只是粗略大意,具体设定方式需根据实际情况来总体考虑,也希望大家来讨论)
    2、数据表中实际的记录放入第二行以后(字段之间以制表符\t分隔):第一个字段为记录指针号码(主要用于定位,此字段也可以不要或作为索引号),记录指针号必须连续,中间不能断号。删除记录只是在一个字段中加一个标志(这样不用每次重新排序,对删除的帖子还可以恢复,帖子回收站功能也不用再生成新文件,若要真正物理删除记录需要重新排序,可以放在管理中心定期处理。)

二、LB程序在处理数据时,大量采用foreach到一个数组变量来循环遍历,效率极其低下!
    解决方法:
    Perl语言的优势就在于字符串处理!在修改、添加、删除、搜索记录时,完全可以一次读入整个文本数据(改变换行符的内置变量$/的默认值,之后再恢复),然后用一个正则表达式一次就可完成,省去大量的循环次数!(用~s/ / /或~m/ /方法绝对可以实现,具体方法暂不公开,你自己去想喽,呵呵)

三、LB在主程序中处理大量的数据低层存储问题,程序修改时极易出错,程序可读性差。
    解决方法:
    采用通用的数据处理函数(子程序),最好采用面向对象的程序设计方法,以“属性”和“方法”来调用和处理数据表信息,如打开、关闭、锁定(排它和非排它两种)数据表,选择分区,调用数据表结构信息,修改、添加、删除、搜索记录数据等。(此项跟运行效率关系不大)

四、html界面显示输出没有真正采用模板方式,程序中存在大量的颜色、字体、表格等样式设置用变量代码。用户改变输出界面极其困难,而且程序每次都要运行处理这些不必要的过程。
    解决方法:
    1、将每一个尽可能多的显示界面,放在一个html模板中。很多变量可以在自写的模板处理子程序中用一个正则表达式全部替换。
    2、在管理中心的变量、风格设置后直接生成半成品模板,风格设置使用css文件。
    3、在模板中可以大量采用javascript语言,把一些条件判断、循环和时间处理程序等跟界面有关的部分,全都放在html模板中。这样不但简化程序,方面用户修改界面,而且可以降低资源消耗。
    (我个人认为辽宁enter的ibb论坛是目前最具创意的一个,采用c++语言编写,里面的html模板大量采用javascript,速度快得不可想象。由于在浏览器地址栏直接运行.dll文件,需要拥有独立主机的设置权限,也因此应用范围受限,比较遗憾。感兴趣的朋友可以去下载免费版看一看。)

五、LB程序中存在大量的变量污染,导致无法在mod_perl(对模块预先编译)和fast-cgi模式(运行效率非常高,强烈推荐,需要对程序略做修改)下运行,效率无法提升。
    解决方法:
    使用面向对象的程序设计方法。

六、LB每个界面用一个单独的主程序,每个程序的开始部分都是大量相同的代码,程序修改复杂。
    解决方法:
    论坛只用一个主程序调用其它程序,以.pm存储,用evel方式运行,也方便改为fast-cgi模式运行。

其它说明:
    1、如果采用现成的数据库系统,如mysql,sql,access等,上面的1、2、3条问题就不存在了。
    2、个人认为,LB论坛程序仍然应采用文本方式存储数据。因为绝大多数用户购买的是虚拟主机空间,一般仅支持数据库access和mysql,即asp+access+windows或php+mysql+linux系统,但用perl语言写的cgi程序若要使用上面的这两种数据库,还要求主机提供商数据库设置和安装相应驱动模块后才能使用,这是不太现实的。
   3、当然,若按照上文思路改写后,转换成一个支持mysql、access等数据库版本的cgi论坛,也就非常容易了。
   4、FastCGI简介: 一次web请求启动一个进程后将常驻内存,以后每次web请求都只运行同一进程。对一个初始化动作复杂,例如要先和数据库建立联机,或是配置内存,做变量初始化的程序来说,使用 FastCGI 可以比原先 CGI 在效能上增加更多,速度更快。而对一个有数据库可联机数目限制的系统来说,使用  FastCGI 就好象一个 Application Server 一样,不用担心 CGI 一次 fork 太多,超过联机数目上限 (FastCGI 可以设定一次跑几支)。 速度完全可以超过目前的PHP脚本程序。(即使采用文本数据的方式,文件加解锁等就可以通过设置一个公共变量来实现,而不用再往硬盘读写文件。)

---------------------------------------------
注意:
    1、以上仅为个人观点,为推动LB论坛的发展,欢迎共同探讨。转载此文请保留作者等信息。
    3、有关此文的技术性讨论请集中在此回帖:http://www.hi-gi.com/cgi-bin/top ... 4727&show=0,此贴中的非技术性回帖保留一天后删除,请谅解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP