GVKun编程网logo

phpcms 源码解析-模板发动机

1

如果您想了解phpcms源码解析-模板发动机的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析(转)对帝国cms、dedecms、phpcms、discuz、phpwind、xiuno负载测试总

如果您想了解phpcms 源码解析-模板发动机的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析(转)对帝国cms、dedecms、phpcms、discuz、phpwind、xiuno负载测试总结、CMS系统:PHPCMS V9 /phpcms/modules/member/index.php phpcms注入漏洞修复补丁、phpcms v9 tag 标签页输出缩略图标签、phpcms v9 上传到空间出_无需整理的各个方面,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

phpcms 源码解析-模板发动机

phpcms 源码解析-模板发动机

phpcms 源码解析-------模板引擎
PHPCMS 整站代码分析讲解(六)之模板引擎
发布:水水

19 May

/**
函数 template函数是在global.func.php 里面定义的。 在前面的phpcms 的首页 index.php 里就见到了。  用法: include template()    用法很熟, 呵呵其实和 dz 的模板引擎一样的用法。 但DZ的模板引擎比 PHPCMS 的简单很多,因为没有用到模板的标签技术。 大家有空可以研究下DZ的模板引擎。这里不说。  好分析下上面这个 模板的主要函数吧。  他的作用是返回编译好的模板文件路径。也就是把模板 X.html(模板文件) 用正则替换成 x.php(编译后的PHP文件).然后使用 include  函数。懂了吧! php的模板引擎都一个鸟样。 然后剩下的就是正则的东西了。等下再说。
*/
function template($module = ''phpcms'', $template = ''index'')
{
global $CONFIG;
$compiledtplfile = $CONFIG[''templatescachedir''].$module.''_''.$template.''.tpl.php'';
/**
因为phpcms是分模块来存放模板文件。所以 template 函数有两个参数: 第一个就是模块目录名,第二个就是此模块里面的模板文件名.
$CONFIG[''templatescachedir'']  这个是放编译后php文件存放的目录。在config.inc.php 站点配置文件里面定义的自己去看。 这样就取得了模板编译后的php文件路径。
*/
if($CONFIG[''templaterefresh'']) //$CONFIG[''templaterefresh'']  在 config.inc.php里面配置了。默认是1  。是更新模板开关。如果你设置为0 那么模板更新了。程序也不会更新。
{
        $tplfile = PHPCMS_ROOT.''/templates/''.$CONFIG[''defaulttemplate''].''/''.$module.''/''.$template.''.html'';
  /**
  和上面那句意思差不多。$CONFIG[''defaulttemplate''] 是默认模板目录  。这句是获取你要的那个模块和里面的那个模板文件的路径(@@获取没编译前的模板文件)
  */
        if(!file_exists($compiledtplfile) || @filemtime($tplfile) > @filemtime($compiledtplfile))
  {
   /**
   我把文件编译成了php文件。那么模板改变了。 php文件总得也改变吧。要不你修改了模板后。站还是以前那个样子没变那有什么意思呢。
   首先判断模板编译文件是否存在。如果不存在那么后边那个条件不用判断了。 因为编译文件都不存在。程序肯定运行不了拉。(因为其实我们主要是运行编译后的那个php文件,模板文件是html的运行个P呀)
   或  后边那个 @filemtime($tplfile) > @filemtime($compiledtplfile)  很容易就明白:  函数 filetime() 判断文件最近修改的时间,返回Unix 时间戳。 如果模板文件的修改时间 大于 编译文件。 那么证明 模板文件  在 编译文件生成后 还进行了修改。那么我们是不是还要在更新次编译文件呀 ,那是肯定的拉。 所以继续执行下去。
   */
   require_once PHPCMS_ROOT.''/include/template.func.php'';   // 加载编译函数
   template_refresh($tplfile, $compiledtplfile);// 这个就是模板的 编译启动函数 ,带动一系列的模板编译函数来最终生成模板编译文件。
  }
}
return $compiledtplfile; // 返回 模板编译后的PHP文件路径。
}

defined(''IN_PHPCMS'') or exit(''Access Denied'');
function template_compile($module,$template) //和下面那个一样是编译模板启动函数。不过两函数的参数不一样,按照上下文意思。这个函数是为了配合批量编译模板而写的。第一个是模块目录名,第二是模板文件名,解释同下。请看下面那个
{
global $CONFIG;
$content = file_get_contents(PHPCMS_ROOT.''/templates/''.$CONFIG[''defaulttemplate''].''/''.$module.''/''.$template.''.html'');
$content = template_parse($content);
$compiledtplfile = $CONFIG[''templatescachedir''].$module.''_''.$template.''.tpl.php'';
$strlen = file_put_contents($compiledtplfile, $content);
@chmod($compiledtplfile, 0777);
return $strlen;
}
function template_refresh($tplfile,$compiledtplfile) //模板编译启动函数。 参数 第一个是 模板文件名  第二个是 编译后的php文件名
{
$str = file_get_contents($tplfile); //使用了php5 的最爽函数:file_get_contents() 获取文件的内容 。
$str = template_parse($str); /*然后 使用 template_parse() 函数来对文件内容进行替换。比如把一些我们自己定义的语句:{if xx > xx}  正则替换成 xx){?>具体看下面*/
$strlen = file_put_contents($compiledtplfile, $str);//编译完成后。把内容写到我们的 那个所谓的编译PHP文件。
@chmod($compiledtplfile, 0777);  //别忘了设置下权限。
return $strlen; //返回 写到编译文件里的内容字大小节数,下面我们看下 template_parse() 函数
}
function template_module($module)//这个很有用。批量编译某模块目录下的模板文件
{
global $CONFIG;
$files = glob(PHPCMS_ROOT.''/templates/''.$CONFIG[''defaulttemplate''].''/''.$module.''/*.html'');
/*
glob 函数  取得 在此路径下的所有 *.html 以html为扩展名的文件列表。 具体看手册。
**/
if(is_array($files))
{
  foreach($files as $tpl)
  { //开始批量
   $template = str_replace(''.html'', '''', basename($tpl));
   // 获取模板文件名。以次来做编译后的PHP文件名
   template_compile($module, $template); //这个函数上面讲过了。看上面
  }
}
return TRUE;
}
function template_cache() //这个是比上面那个更大批量的生成。因为 $MODULE 里面的所有模块  $MODULE 存在于缓存文件模板。前面已经说了。自己看吧
{
    global $MODULE;
foreach($MODULE as $module=>$m)
    {
        template_module($module);
}
return TRUE;
}
/**
哇,别给它吓到。其实都是些简单的正则。只要知道他们是干什么的就好办了。 在模板里面我们使用了些自己定义的标签呀。语句呀。这些东西不是PHP标准语法。所以根本不可能运行。
那么怎么办呢。通过正则对我们自己定义的语法 。转变成标准的PHP语法。然后写到我们的 PHP文件里。所以下面正则都是对我们自己定义的语法进行编译。
下面讲解下正则。按照本人水平解释。大概的解释了下。不过不懂正则的请自己百度学下。有不对的地方。大家可以讨论下。@@   还没懂 preg_replace() 函数的同学兄弟朋友姐妹。请自己看手册。
*/
function template_parse($str)
{
$str = preg_replace("/([\n\r]+)\t+/s","\\1",$str); 
// 用 \n\r 过滤掉 tab制表符,  \\1 是逆向引用了第一个括号里面\n换行\r换页匹配的文本 (@@解释好要口,最好自己看下正则知识 /s为修正符。自己百度吧)
$str = preg_replace("/\/s", "{\\1}",$str);
// 以 {xx} 来替换 {xx}在下面肯定还要进行第二次正则替换,要不是不能在PHP里面运行的。  .+? 和 .+ 一个是懒惰 一个是贪婪。  看名字就知道。不知道的 百度吧: 正则贪婪。

$str = preg_replace("/\{template\s+(.+)\}/","\n\n",$str);
/* 把模板里面的 {template ''xx'',''jj''} 编译成PHP标准写法:   大家可能一看就明白了: include template()  这个在那里见过。对了。这个在PHP里也可以运行的。因为 template() 函数不是定义了吗。*/
$str = preg_replace("/\{include\s+(.+)\}/","\n\n",$str);
/* 模板里面的 {include xx.php} 编译成 PHP文件里的 **/
$str = preg_replace("/\{php\s+(.+)\}/","\n\n",$str);
/* 模板里面的 {php xxxx} 编译成   大家也应该明白了。 xxxx 肯定是PHP的标准语法拉。 所以phpcms模板语句: {php } 就是用来给你在模板里写要运行的PHP语句。在smarty 里也有这功能**/
$str = preg_replace("/\{if\s+(.+?)\}/","",$str);
/* 这个就更简单了。 把模板里面的{if xxxx}  编译成   看这样一步一步的把一些自己定义的语句编译成PHP的标准语法。这个就叫模板引擎了。**/
$str = preg_replace("/\{else\}/","",$str);
/* {else } 转 **/
$str = preg_replace("/\{elseif\s+(.+?)\}/","",$str);
/* {elseif } 转 **/
$str = preg_replace("/\{\/if\}/","",$str);
/* {/if} 转   phpcms 模板语法有: {/if}的哦。大家别忘了,要不 php肯定运行不了**/
$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\}/","",$str);
/* 下面就是循环了。模板里用{loop xx jj} 其实编译成了PHP的 foreach(xx AS jj) 这样大家都会用了吧**/
$str = preg_replace("/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}/","\n \\3) { ?>",$str);
/* 这句和上面也差不多。不过是多了个取出数组的标名  {loop xx jj yy}  成 foreach(xx as jj=> yy)**/
$str = preg_replace("/\{\/loop\}/","\n\n",$str);
/* 循环结束别忘了 {/loop}  对应PHP的 **/
$str = preg_replace("/\{tag_([^}]+)\}/e", "get_tag(''\\1'')", $str);
/* {tag_xx}  替换为 get_tag(''xx'')  get_tag()  函数是自己定义的函数,因为phpcms 的模板引擎应用了标签功能。这个函数就是为了调用标签的。**/
$str = preg_replace("/\{([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/","",$str);
/* {xxx(jj)}  这么个奇怪的东西。因为奇怪所以我找了下PHPCMS的模板文件。找了几个文件都没发现这个怪物。大家有谁找到的说下我去看下。怕是我理解错了正则。先谢了**/
$str = preg_replace("/\{\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(([^{}]*)\))\}/","",$str);
/* {$xxx(wwsd)} 专换成    当然了 xxx() 是程序中定义过的函数**/
$str = preg_replace("/\{([a-zA-Z0-9_\x7f-\xff]*)\}/]\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/","",$str);
/* 把{$xxjj} 转成   当然了是把变量输出**/
$str = preg_replace("/\{(\]\\$[a-zA-Z0-9_\[\]\''\"\$\x7f-\xff]+)\}/es", "addquote('''')",$str);
/* 主要是把{$xxx[''jj'']} 转成   addquote() 函数自己定义的看下面,二次过滤。有代验证,头昏了看太久的黄色字。我昏**/
$str = preg_replace("/\{([A-Z_\x7f-\xff][A-Z0-9_\x7f-\xff]*)\}/s", "",$str);
/* {XXJJ}    XXJJ 是我们定义的常量**/
$str = "".$str;
/* 最后别忘了在自己的每个编译后的文件里加上这个。以前讲过了不明白找前面例子**/
return $str; //最后返回过滤完成的内容
}
function get_tag($tagname) //这个函数在  上面这个编译函数里面看到了。 其实就是获取对应标签的内容,头有点昏,下节再说标签吧。
{
global $tags,$html,$CONFIG;
    if(!$tags) require PHPCMS_ROOT.''/templates/''.$CONFIG[''defaulttemplate''].''/tags.php'';
    if(!$html) require PHPCMS_ROOT.''/templates/''.$CONFIG[''defaulttemplate''].''/html.php'';
if(!isset($tags[$tagname])) return ''{tag_''.$tagname.''}'';
$code = isset($html[$tagname]) ? ''tag_read(''.$html[$tagname].'')'' : $tags[$tagname];
return "";
}
function addquote($var)
{
return str_replace("[url=]\\\[/url]"", """, preg_replace("/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s", "[''\\1'']", $var));
}
?>
[size=xx-small][/size]

(转)对帝国cms、dedecms、phpcms、discuz、phpwind、xiuno负载测试总结

(转)对帝国cms、dedecms、phpcms、discuz、phpwind、xiuno负载测试总结

担心被骂,本不想写这篇文章。犹豫良久,最终还是决定写。希望能够帮助到一些朋友,认识到数据库索引正确设计的重要性。

由于我比较懒,就简单用文字描述一下,就懒得切图片证明了,懂技术的朋友可以自己测试一下,可证实我的测试结果是否真实。不懂技术的朋友信不信也无妨。

测试程序:

CMS程序:帝国cms dedecms phpcms

论坛程序:discuz phpwind xiuno

负载测试结果:

xiuno > discuz > phpwind > phpcms > ( 帝国cms ? dedecms)

从数据库设计来看(个人观点):

xiuno > (discuz 、 phpwind 、 phpcms) > (帝国cms 、 dedecms)

dedecms和帝国cms都是老牌的CMS了,从的数据库设计来看,不知是数据库设计者完全没有理解mysql索引的真谛,还是留一手以对高负载需求的用户收费改进?(希望不懂技术的朋友不要喷我,真正懂mysql索引的朋友可以自己看一下他们对索引的设计,虽然对于dedecms和帝国cms的作者来说,我只是一个晚辈,像您们这样有10多年开发经验的人,我比较尊敬,但我建议当前的dedecms和帝国cms数据库设计者还是再研究一下mysql索引吧,可以不相信我,但可以花点时间看看discuz 、phpwind的数据库设计吧,确实是比您们的好)。

如果有幸帝国cms作者能看到此文,希望您再重新设计帝国cms架构吧,毕竟这些年您一直在改进帝国cms的负载能力,光是通过分表技术提升,没有真正用到索引来优化,真的不行的,如果用对了索引,性能还会有更大的提升。

dedecms的创始人我算是和他认识,但现在dedecms却不是他的,比较遗憾,现在的dedecms这几年确实没多大变化,一直在打补丁,这样下去真是比较悲剧。

我的测试环境:

i3CPU 4G内存 1T硬盘 win7系统   apache 2.2 + mysql 5.0(普通环境没有优化过)

测试方法:

导入100万至1亿 不等数据,进行简单的访问测试

我的导入方法:

根据各个程序的数据结构写出导入程序,

1.先写一个PHP程序,将数据写入 e:/insert1.sql 这个文件,

2.然后再通过 LOAD DATA local INFILE ''e:/insert1.sql'' INTO TABLE `数据表名` character set 编码; 这种方式导入的,导入千W数据也就几分钟。

1、帝国cms

测试版本:EmpireCMS_7.0_SC_GBK (当前官方最新版)

先说说帝国cms,官方有一篇大数据测试贴(2千万数据、17.3GB数据库下帝国CMS超强生成速度 ),当年我看到这篇测试贴时,也觉得负载非常强大,但我测试后,令我失望了。

安装默认测试数据(共33篇新闻测试数据),首页改为动态首页 第一次访问0.670127010345459 第二次访问0.07926607131958

我导入100W数据时,数据库大小3.6G,首页第一次访问182秒,第二次访问155秒,我不知道当时帝国cms作者测试时,是否有测试过动态访问首页的时间。包括从6.0版起,每次更新都有说提升性能,但为何会这样?

帝国CMS官方的测试帖,就是误导人,忽悠人。

问题1.测试数据并没有提到动态访问首页或是生成首页。也没有提到动态访问列表页,和生成列表页。

问题2.测试统计的时间,也只统计了连接数据库之后的执行时间,并没有加上连接数据库的时间,这样很容易误导很多人,拿这个时间和别人统计了连接数据库的时间比。这样就差别大了。

问题3.每篇新闻的内容很少也就几行字。同时内容页模板,也非常简单,生成出来的文件也非常小,只有3K。正常的文章,都是上10K至几十K。

问题4.同时因为phome_ecms_news表 id 为主键,读取内容时,都是走的索引,所以动态访问内容页,编辑内容,生成内容页很快,都是理所当然的。

问题5.测试时都是通过分表来测试的,在真实站长做网站,不可能一开始就把网站内容分表。所以这和真实做站情况完全不一样。

像官方这种测试贴,真是误导人,而且还挂了几年。对于不懂技术的人,就是一种误导,让普通用户盲目的崇拜。

2、dedecms

测试版本:DedeCMS V5.7 SP1_GBK正式版 (当前官方最新版)

织梦CMS在知度CMS中一直公认的负载性能最差的CMS,确实很差。

我导入100W数据时,数据库大小只有330M,首页访问已经需要70几秒-80几秒才能访问。

3、phpcms

测试版本:PHPCMS V9_GBK 正式版 (当前官方最新版)

PHPCMS现在是由新的团队重新开发,也是号称高负载。

我导入100W数据时,数据库大小3G,首页访问需要20几秒。

4、phpwind

测试版本:phpwind v9.0 UTF-8 正式版(当前官方最新版)

phpwind以前和discuz比,速度上有优势,现在据说是全新开发,新版确实做了很大的改变(以前一直是discuz追随者,和discuz设计差别不是很大),现在这一变化,应该值的赞扬,但现在速度上不如discuz了,以前网页底部显示执行时间都去掉了。

我导入1000W数据时,数据库大小13G,

首页第一次访问8秒,第二次访问0.70477390289307秒

帖子列表页(默认排序)0.2x-0.5x秒  但我采用按“最新发贴”排序时,花了182秒才显示出来(我看了数据库设计,因为只做了按“最后回复”的索引,“发帖时间”的排序都没做索引,所以才很慢) 

帖子内容页,没填充多少回帖也没具体测试

5、discuz

测试版本:Discuz_X2.5_SC_UTF8  Discuz_X3.0_SC_UTF8

dx3看来是dx2.5的加强版,从后台、前台设计看,都变化不大。数据库架构变化也不大。

我导入1000W数据时,数据库大小18G,

首页0.05-0.06秒,(也没太大测试价值,因为都没读到thread表)

帖子列表页(默认排序)0.07-0.09秒 但我采用按“发帖时间”排序时,花了181秒才显示出来(我看了数据库设计,因为只做了按“最后回复”的索引,“发帖时间”的排序都没做索引,所以才很慢) 

帖子内容页,(没填充多少回帖也没具体测试)

6、xiuno

测试版本:xiuno bbs 2.02 UTF8

我导入1000W数据时,数据库大小15G

首页0.03-0.05秒

帖子列表页0.03-0.05秒(回贴排序)    0.01-0.03秒(发帖排序)

帖子内容页0.03-0.05秒 (没填充多少回帖也没具体测试翻页)

我导入1亿数据时,数据库填充到215G

首页0.05-0.08秒

帖子列表页0.05-0.08秒(回贴排序)     0.03-0.05秒(发帖排序)

帖子内容页0.05-0.08秒 (没填充多少回帖也没具体测试翻页)

总结:

xiuno 虽然负载很高,但是功能上有很大的控制,去掉了很多可能影响到性能的功能,功能方面我觉得要是能有一个像wordpress这样的一个平台来弥补,那将会有非常大的优势。

discuz 虽然没做深入测试,不过已经可见负载上面还是有缺陷的,同时thread表设计为 tid mediumint(8) UNSIGNED 所以最大数值也就16777215,所以他的设计也并没有往更高考虑。

phpwind 这次的新版本的改变,证明了他们的决心,要和discuz走不同的路,也能看出来他们更注重用户体验方面。程序性能已经次之。

phpcms 性能是比以前提升了,但是用户体验我是感觉不太好。不过能够说明CMS性能方面不如BBS程序。因为排序方式多,而且同一个页面列表也比论坛的多,所以让CMS性能不如BBS。

帝国cms 虽然程序官方一直强调负载,但真还不如phpcms,光是通过分表提高负载,真不是一个好办法。我个人愚见,程序负载高不高,第一步应该是正确设计索引,索引都没设计对,就用分表来解决,而且还要站长手动设置,完全增加使用难度。

dedecms 虽然用户量非常大,但数据库设计真不好,不但索引没设计对,而且还没分表,而且也能看出dedecms并没有考虑做高负载,毕竟上百W级数据的网站很少。

CMS系统:PHPCMS V9 /phpcms/modules/member/index.php phpcms注入漏洞修复补丁

CMS系统:PHPCMS V9 /phpcms/modules/member/index.php phpcms注入漏洞修复补丁

《CMS系统:PHPCMS V9 /PHPcms/modules/member/index.PHP PHPcms注入漏洞修复补丁》要点:
本文介绍了CMS系统:PHPCMS V9 /PHPcms/modules/member/index.PHP PHPcms注入漏洞修复补丁,希望对您有用。如果有疑问,可以联系我们。

漏洞名称:PHPcms注入漏洞

文件路径:/PHPcms/modules/member/index.PHP
修复方法来源于网络,由风信网整理提供.
源代码大概615行:
if(empty($_SESSION['connectid'])) {
//判断验证码
$code = isset($_POST['code']) && trim($_POST['code']) ? trim($_POST['code']) : showmessage(L('input_code'),HTTP_REFERER);
if ($_SESSION['code'] != strtolower($code)) {
    $_SESSION['code'] = '';
    showmessage(L('code_error'),sans-serif; line-height: 30px;">}
$_SESSION['code'] = '';
$username = isset($_POST['username']) && is_username($_POST['username']) ? trim($_POST['username']) : showmessage(L('username_empty'),sans-serif; line-height: 30px;">$password = isset($_POST['password']) && trim($_POST['password']) ? trim($_POST['password']) : showmessage(L('password_empty'),sans-serif; line-height: 30px;">针对phpsso模块添加过滤代码,最好的方式应该是将转义和过滤放在数据库操作的前一步,这样可以极有效缓解sql注入带来的问题
修改代码:
$password = isset($_POST['password']) && trim($_POST['password']) ? trim($_POST['password']) : showmessage(L('password_empty'),sans-serif; line-height: 30px;">改为:
$password = isset($_POST[‘password‘]) && trim($_POST[‘password‘]) ? addslashes(urldecode(trim($_POST[‘password‘]))) : showmessage(L(‘password_empty‘),HTTP_REFERER);

phpcms v9 tag 标签页输出缩略图标签

phpcms v9 tag 标签页输出缩略图标签

在做 phpcms v9 站优化的时候,把 tag 标签页面改吧改吧,由于是个视频站,所以输出缩略图就很有必要了,但是默认的缩略图是不会输出内容的,so 找了下,需要改个 php 文件,就可以了。。

修改 \phpcms\modules\content\tag.php 这个文件,

找到:

''title, description, url, inputtime, style''

改成:

''title, thumb, description, url, inputtime, style''

这里面加个 thumb,你懂得 o (∩_∩) o。。。

声明:本文采用 BY-NC-SA 协议进行授权,转载还请注明:phpcms v9 tag 标签页输出缩略图标签

phpcms v9 上传到空间出_无需整理

phpcms v9 上传到空间出_无需整理

phpcms v9 安装好了,还会跳转到安装页面
1.检查 caches/ 目录下是否有生成install.lock文件
2.清除浏览器缓存

今天关于phpcms 源码解析-模板发动机的讲解已经结束,谢谢您的阅读,如果想了解更多关于(转)对帝国cms、dedecms、phpcms、discuz、phpwind、xiuno负载测试总结、CMS系统:PHPCMS V9 /phpcms/modules/member/index.php phpcms注入漏洞修复补丁、phpcms v9 tag 标签页输出缩略图标签、phpcms v9 上传到空间出_无需整理的相关知识,请在本站搜索。

本文标签: