mg4377娱乐娱城官网_mg4377娱乐手机版_www.mg4377.com

mg4377娱乐手机版:phpcms学习总计,phpcms缓存总计

时间:2019-06-21 17:51来源:mg4377娱乐手机版
phpcms使用的缓存格局总括 a.模板编写翻译缓存 参谋文件include/global.func.php及include/template.func.php 模板编译缓存的规律其实很轻松,借使模板是率先次编写翻译,则直接编译它,倘诺不是

phpcms使用的缓存格局总括
a.模板编写翻译缓存

参谋文件include/global.func.php及include/template.func.php
模板编译缓存的规律其实很轻松,借使模板是率先次编写翻译,则直接编译它,倘诺不是第叁遍编写翻译,则比较模板文件($tplfile)及模板缓存文件 ($compiledtplfile)的修改时间,假若模板文件的改造时间大于编写翻译过的模版缓存文件,则编写翻译模板,不然不编写翻译模板,进步了先后的试行成效。
function template($module = 'phpcms', $template = 'index')
{
    global $CONFIG;
    $compiledtplfile = $CONFIG['templatescachedir'].$module.'_'.$template.'.tpl.php';
    if($CONFIG['templaterefresh'])
    {
        $tplfile = PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/'.$module.'/'.$template.'.html';
        if(!file_exists($compiledtplfile) || @filemtime($tplfile) > @filemtime($compiledtplfile))
        {
            require_once PHPCMS_ROOT.'/include/template.func.php';
            template_refresh($tplfile, $compiledtplfile);
        }
    }
    return $compiledtplfile;
}

 方今在切磋PHPCMS系统,前天与我们享受的是PHPCMS系统的缓存格局计算,就算大家有以为狼狈的地方请提出来。**

都以很轻易的东西.大家瞧着本人注释稳步看吧.慢慢精通,最CANON装了PHPCMS 在来看.因为如此可以看下它的数据库结构信息.能够扶持通晓.

文件目录结构
根目录
|  –  api  接口文件目录
|  –  caches 缓存文件目录
       |  – configs 系统配置文件目录
       |  – caches_* 系统缓存目录
|  –  phpcms  phpcms框架主目录
       |  – languages 框架语言包目录
       |  – libs 框架主类库、主函数库目录
       |  – model 框架数据库模型目录
       |  – modules 框架模块目录
       |  – templates 框架系统模板目录
|  –  phpsso_server  phpsso主目录
|  –  statics  系统附件包
       |  – css 系统css包
       |  – images 系统图片包
       |  – js 系统js包
|  –  uploadfile  网站附件目录
|  –  admin.php  后台管理入口
|  –  index.php  程序主入口
|  –  crossdomain.xml  FLASH跨域传输文件
|  –  robots.txt 搜索引擎蜘蛛限制配置文件
|  –  favicon.ico  系统icon图标



URL访问
PHPCMS是采用MVC设计模式开发,基于模块和操作的方式进行访问,采用单一入口模式进行项目部署和访问,无论访问任何一个模块或者功能,只有一个统一的入口。
参数名称    描述    位置    备注
m    模型/模块名称    phpcms/modules中模块目录名称    必须
c    控制器名称    phpcms/modules/模块/*.php 文件名称    必须
a    事件名称        phpcms/modules/模块/*.php 文件中方法名称

模块访问方法[示例]:
http://zuzwn.com/index.php?m=content&c=index&a=show&id=1
其中
m = content 为模型/模块名称 位于phpcms/modules/content
c = index   为控制器名称    位于phpcms/modules/content/index.php
a = show    为方法名称      位于phpcms/modules/content/index.php 中show()方法
id = 1 为其他参数 与正常get传递参数形式相同

如果我们访问您的域名 如:
http://www.yourdomain.com/index.php
phpcms默认路由会定位到content模块的index控制器中的init操作,因为系统在没有指定模块和控制器的时候,会执行默认的模块和操作。
因此下面的URL的结果是相同的:系统还支持URL路由的功能,这些都能够带来其他的url访问效果。
http://www.yourdomain.com/index.php?m=content&c=index&a=init



系统类库与函数调用
1.系统类库位于系统的phpcms/libs/classes目录下面,函数库文件名为*.class.php
2.系统函数库位于系统的phpcms/libs/functions目录下面,函数库文件名为*.func.php,其中global.func.php为框架中默认加载,global.func.php中函数可直接使用
系统类库调用
pc_base::load_sys_class('类名','扩展地址','是否初始化');
示例:
$http = pc_base::load_sys_class('http'); //实例化http类
pc_base::load_sys_class('format', '', 0); //调用form类,不进行实例化操作
系统函数库调用
pc_base::load_sys_func('函数库名');
示例:
pc_base::load_sys_func('mail'); 调用mail函数包



模块
phpcms v9框架中的模块,位于phpcms/modules目录中 每一个目录称之为一个模块。即url访问中的m
示例:
http://www.yourname.com/index.php?m=content
那么您访问的就是phpcms/modules/content 这个模块。
如果创建一个模块,只要在 phpcms/modules 目录下创建文件夹并放入你的控制器类就可以了



控制器
phpcms v9的控制器就是模块的类文件,位于phpcms/modules/模块/目录下面。类名成就是文件名 .php,例如一个名为mytest的控制器,那么他的命名为mytest.php即可。
控制器类默认继承系统的函数库,可以直接使用。控制器类的类名称与控制器文件名必须相同
如果您创建了一个mytest.php在test模块下,那么我们在浏览器里面输入URL:
http://www.yourname.com/index.php?m=test&c=mytest

下面是一个控制器类的基本格式,在构建模块部分会具体讲解
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
class mytest {
    function __construct() {
    }
    public function init() {
        echo 'hellp phpcms v9,my name is defalut action';
    }
}
?>
如果你添加的控制器类继承了其他的类,你要小心你的方法名不要和那个类中的方法名一样了,否则你的方法会覆盖原有的。



命名规范
PHPCMS其自身的一定规范。下面是使用PHPCMS做二次开发中应该遵循的命名规范:
类文件需要以.class.php为后缀(这里是指的phpcms的系统类库文件和模块中的类库文件,第三方引入的不做要求),例如http.class.php。
函数文件需要以.func.php为后缀(第三方引入的不做要求),例如mail.func.php。
类名和文件名一致,例如 phpcmsapp类的文件命名是phpcmsapp.class.php。
数据模型需要以“数据表名称_model.class.php”为形式,类名称与文件名必须相同。



配置文件调用
配置文件配置在caches/configs/目录下。
配置文件调用:使用 load_config方法
$upload_url = pc_base::load_config('配置文件','要获取的配置键','默认配置。当获取配置项目失败时该值发生作用','是否强制重新加载');
示例:
调用系统配置中的附件路径
$upload_url = pc_base::load_config('system','upload_url');



二次开发技巧
1.如果要对已存在的控制器进行二次开发,为了方便升级不建议直接对内核文件直接修改该,您可以通过"MY_*.php"的形式进行二次开发。
例如您要对改phpcms/mood/index.php进行二次开发。您可以在与index.php同级的目录下建立"MY_index.php"
MY_index.php代码如下
<?php
class MY_index extends index{
    function __construct() {
        parent::__construct();
    }
    //……your code
 }
 ?>
这样当您通过url访问index控制器的时候,系统会默认指向MY_index.php 并且原文件的方法将被继承,可以直接使用。



数据库配置
数据库配置文件位置:caches/configs/database.php
我们打开这个配置文件,加入我们的数据库配置信息。数据库配置信息为二维数组结构,默认为default,可以根据default结构配置多个数据库链接(如:extended_1)
<?php
return array (
    'default' => array (
        'hostname' => 'localhost',
        'database' => 'phpcms',
        'username' => 'admin',
        'password' => 'admin',
        'tablepre' => 'v9_',
        'charset' => 'gbk',
        'type' => 'mysql',
        'debug' => true,
        'pconnect' => 0,
        'autoconnect' => 0
    ),
    /* 以下格外添加*/
    'extended_1' => array (
        'hostname' => '10.10.125.2',
        'database' => 'phpcms',
        'username' => 'admin',
        'password' => 'admin',
        'tablepre' => 'v9_',
        'charset' => 'gbk',
        'type' => 'mysql',
        'debug' => true,
        'pconnect' => 0,
        'autoconnect' => 0
    ),
);
?>
根据您的数据库连接信息修改上面的配置内容,修改完成后,保存该数据库配置文件。



路由配置
路由配置文件位置:caches/configs/route.php
我们打开这个配置文件,加入我们的路由配置信息。路由配置信息为二维数组结构,默认为default。
路由配置文件内容是这样的:
<?php
return array(
    'default'=>array('m'=>'admin', 'c'=>'index', 'a'=>'init'),
    'test.youname.com'=>array('m'=>'test', 'c'=>'index', 'a'=>'init'),
);
?>
data为一个二维数组,可设置POST和GET的默认参数。POST和GET分别对应PHP中的$_POST和$_GET两个超全局变量。
如下面的例子,在程序中您可以使用$_POST['catid']来得到data下面POST中的数组的值。
data中的所设置的参数等级比较低。如果外部程序有提交相同的名字的变量,将会覆盖配置文件中所设置的值。
如:
<?php
return array(
    'default'=>array(
        'm'=>'phpcms',
        'c'=>'index',
        'a'=>'init',
        'data'=>array(
            'POST'=>array(
                'catid'=>1
            ),
            'GET'=>array(
                'contentid'=>1
            )
        )
    )
)
?>
外部程序POST了一个变量catid=2那么你在程序中使用$_POST取到的值是2,而不是配置文件中所设置的1。



系统配置
系统配置文件位置:caches/configs/system.php
具体详见该文件注释



构建模块
开发流程
为你的phpcms创建一个模块的一般开发流程是:
1.    创建数据库和数据表;(没有数据库操作可略过)
2.    创建模块目录
3.    创建模块控制器类;
4.    创建模块类与模块函数;(如果只是简单的模块可以不必创建)
5.    创建模板文件;
6.    运行和调试。

创建模块
phpcms v9框架中的模块,位于phpcms/modules目录中 每一个目录称之为一个模块
如果要创建一个模块,只要在 phpcms/modules 目录下创建文件夹并放入你的控制器类就可以了。
例如我要开发一个叫做test的模块,那么首先在 phpcms/modules 目录下创建文件夹,并将其命名为test。
test文件夹下通常有三个文件夹:
classes    为模块类库包
functions  为模块函数库包
templates  为模块模板包 这里通常放置含有权限控制的控制器模板,也就是后台模板。

如果您的模板有单独的前台模板,你需要在phpcmstemplatesdefault下创建一个您的模块目录来放置前台模板
"default"为你的风格包名称,我们默认适用default
这里我们在default文件夹下创建名为test的文件夹存放模板



创建模块控制器
在创建模块中我们已经创建好了一个名为“test”的模块,接下来我们继续为这个模块添加两个控制器类。
phpcms v9的控制器就是模块的类文件,位于phpcms/modules/模块/目录下面。
类名成就是文件名 .php,例如一个名为mytest的控制器,那么他的命名为mytest.php即可。
控制器类默认继承系统的函数库,可以直接使用。控制器类的类名称与控制器文件名必须相同。

控制器类文件包含两种形式:
1.mytest.php 控制器,前台浏览(不含权限控制)
<?php
/*
defined('IN_PHPCMS') or exit('No permission resources.');
class mytest {
    function __construct() {
    }
    public function init() {
        $myvar = 'hello world!';
        echo $myvar;
    }
    public function mylist() {
        $myvar = 'hello world!this is a example!';
        echo $myvar;
    }
}
*/
?>
这个控制器的url访问方法前面已经介绍过了
http://www.zuzwn.com/index.php?m=test&c=mytest
http://www.zuzwn.com/index.php?m=test&c=mytest&a=mylist
没有填写 “a” 的情况下,默认调用init方法

2.mytest_admin.php 控制器,后台管理(含权限控制)
后台控制控制器需要加载admin模块下的admin类,并继承该类。
需要注意的是因为你添加的控制器类继承了其他的类,你要小心你控制器的方法名不要和该类中的方法名一样了,否则会造成影响,具体请查看admin类中有哪些方法。
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_app_class('admin','admin',0);
class mytest_admin extends admin {
    public function __construct() {
    }
    public function init() {
        $myvar = 'oh,i am phpcmser';
        echo $myvar;
    }
}
?>
在控制器中增加模板调用
phpcms 可以实现完全的模板与程序分离,所以在我们的控制器程序中要加载模板,才可以更友好的显示出来。
1.加载前台模板
前台模板文件在phpcmstemplatesdefault模块名称 目录中,本示例也就在phpcmstemplatesdefaulttest中
加载模板方法如下:
include template('test', 'mytest', 'default');
其中 test为模块名称 mytest 为模板目录下模板名称,default为风格名称,默认不填为defalut
在上面例子中如果要给mytest.php中init方法加载一个mytest的模板,如下
public function init() {
    $var = 'hello world!';
    include template('test', 'mytest', 'default');
}
这样我们通过url访问该方法的时候也就加载了对应的模板。
2.加载后台模板
后台模板文件在phpcmsmodules模块名称templates 目录中,本示例也就在phpcmsmodulestesttemplates 中
加载模板方法如下:
include $this->admin_tpl('mytest_admin_list');
其中mytest_admin_list为phpcmsmodulestesttemplates中mytest_admin_list.tpl.php,注意:后台模板必须以.tpl.php 作为后缀
在上面例子中如果要给mytest_admin.php中init方法加载一个mytest_admin_list的模板,如下
public function init() {
    $myvar = 'oh,i am phpcmser';
    include $this->admin_tpl('mytest_admin_list');
}



创建数据库模型类
数据库模型位于:phpcms/model/ 目录下。
数据模型文件的命名规则建议为数据表名称 '_model.class.php'
如果在我们的创建的模块中我要使用一个数据库"test",首先需要建立一个数据库模型文件,文件名称为'test_model.class.php'
内容如下:
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_sys_class('model', '', 0);
class test_model extends model {
    public function __construct() {
        $this->db_config = pc_base::load_config('database');
        $this->db_setting = 'default';
        $this->table_name = 'test';
        parent::__construct();
    }
}
?>
注意:
1.数据库模型类名称必须与文件名称相同;
2.$this->db_setting = 'default'为数据库配置文件中配置数据库链接池名称,默认为default,一般情况下不需要修改。
3.$this->table_name = 'test'为数据表名称

这样我们就建立好了一个数据库模型类。
在模块的控制器中使用
$this->db = pc_base::load_model('test_model');
来加载。
具体如下
<?php
/*
defined('IN_PHPCMS') or exit('No permission resources.');
class mytest {
    private $db;
    function __construct() {
        $this->db = pc_base::load_model('test_model');
    }
    public function init() {
        $result = $this->db->select();
        var_dump($result);
    }
}
*/
?>
其中$this->db中所支持的方法请参照phpcms/libs/classes/model.class.php中方法

b.在动态页面里面发生静态的缓存文件
与c的缓存原理类似,只是此处生成的文书名相对稳固
以问啊模块为例实行认证

此目录下有个index.php文件,剖断当前目录下是不是留存名字为index_cache.html的文本,即使有未有过失效期,则一向包罗此文件,不然动态地读取完数据后保存为index_cache.html文件,以备下一次使用。
文件index.php中的内容:
<?php
require_once './include/common.inc.php';
$lastedittime = @filemtime('index_cache.html');
$lastedittime = $PHP_TIME-$lastedittime;
$autoupdatetime = intval($MOD['autoupdate']); //$MOD['autoupdate']源点缓存文件data/cache/wenba_setting.php中的内容
if(file_exists('index_cache.html') && $lastedittime<$autoupdatetime)
{    
    echo "include cache file";
    include 'index_cache.html';
}
else
{
    echo "read dynamic page";
...
?>
怎么判别文件是或不是失效呢,文件data/cache/wenba_setting.php中有如下的设置,在那之中字段autoupdate的值便是文本失效的时间,单位是秒,在后台能够举行安装
文件wenba_setting.php是从何地来的吗,进行设置时自动把各类模块的数目保存到数据库中了,安装时就改换缓存数据了,在include/common.inc.php中等学校函授数cache_all也得以变动缓存,后台进行安装时cache会自动更新的
<?php
 return array (
  'higth_score' => '100',
  'anybody_score' => '2',
  'answer_give_credit' => '5',
  'vote_give_credit' => '1',
  'highscore' => '2',
  'vote_give_actor' => '公司白领

phpcms使用的缓存方式总括
a.模板编写翻译缓存**
参照文件include/global.func.php及include/template.func.php
模板编写翻译缓存的规律其实很轻易,借使模板是率先次编写翻译,则直接编写翻译它,若是或不是第三次编写翻译,则相比模板文件($tplfile)及模板缓存文件 ($compiledtplfile)的退换时间,假如模板文件的修改时间大于编写翻译过的模版缓存文件,则编写翻译模板,不然不编写翻译模板,进步了程序的实践效用。
function template($module = 'phpcms', $template = 'index')
{
    global $CONFIG;
    $compiledtplfile = $CONFIG['templatescachedir'].$module.'_'.$template.'.tpl.php';
    if($CONFIG['templaterefresh'])
    {
        $tplfile = PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/'.$module.'/'.$template.'.html';
        if(!file_exists($compiledtplfile) || @filemtime($tplfile) > @filemtime($compiledtplfile))
        {
            require_once PHPCMS_ROOT.'/include/template.func.php';
            template_refresh($tplfile, $compiledtplfile);
        }
    }
    return $compiledtplfile;
}

率先是数量库类,phpcms 的数据库 分mysql 和mssql 版本.  MSSQL 版本的小编就隐瞒了.  他们要害的sql 语句差异点就在于大家分页常用到的 limit  语句.所以.在 mssql 数据库类驱动里.他做了个蛮好的封装.让MYSQL 和MSSQL在SQL语句方面包车型客车差距性就异常的小了.能够说PHPCMS你能够任由退换数据库只要在代码中换下数据库类驱动就行.

 

魔法师

b.在动态页面里面爆发静态的缓存文件
与c的缓存原理类似,只是此处生成的公文名绝对稳定
以问啊模块为例进行求证

此目录下有个index.php文件,判别当前目录下是或不是留存名字为index_cache.html的文件,若是有未有过失效期,则一贯包括此文件,不然动态地读取完数据后保存为index_cache.html文件,以备下一次选择。
文件index.php中的内容:
<?php
require_once './include/common.inc.php';
$lastedittime = @filemtime('index_cache.html');
$lastedittime = $PHP_TIME-$lastedittime;
$autoupdatetime = intval($MOD['autoupdate']); //$MOD['autoupdate']来源缓存文件data/cache/wenba_setting.php中的内容
if(file_exists('index_cache.html') && $lastedittime<$autoupdatetime)
{   
    echo "include cache file";
    include 'index_cache.html';
}
else
{
    echo "read dynamic page";
...
?>
怎么推断文件是还是不是失效呢,文件data/cache/wenba_setting.php中有如下的设置,当中字段autoupdate的值就是文本失效的时刻,单位是秒,在后台能够张开安装
文件wenba_setting.php是从哪个地方来的吧,进行安装时自动把各个模块的数码保存到数据库中了,安装时就变化缓存数据了,在include/common.inc.php中等高校函授数cache_all也得以变动缓存,后台举办安装时cache会自动更新的
<?php
 return array (
  'higth_score' => '100',
  'anybody_score' => '2',
  'answer_give_credit' => '5',
  'vote_give_credit' => '1',
  'highscore' => '2',
  'vote_give_actor' => '集团白领

<?php
/**
mysql数据库类。写得相比轻巧。也没怎么好说的。我们本人看下明白下。
接下来就可以跳过了。
*/
defined('IN_PHPCMS') or exit('Access Denied');
/**
本条事物是还是不是很熟呀。对了。在上一章早就讲过了。也一度在上一章的common.inc.php 运转文件之中定义了  IN_PHPCMS   所以在偏下的PHP文件里都检验下是还是不是是人为”跳墙“进来的。是就搁浅
*/
/**
* Mysql 数据库类,帮衬Cache功用
*/
class db_mysql
{
/**
* MySQL 连接标记
* @var resource
*/
var $connid;
/**
* 整型变量用来计算被实施的sql语句数量
* @var int
*/
var $querynum = 0;
/**
* 数据库连接,再次来到数据库连接标志符
* @param string 数据库服务器主机
* @param string 数据库服务器帐号
* @param string 数据库服务器密码
* @param string 数据库名
* @param bool 是还是不是维持不断连接,1为不断连接,0为非持续连接
* @return link_identifier
*/
function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0)
{
  global $CONFIG;
  $func = $pconnect == 1 ? 'mysql_pconnect' : 'mysql_connect';
  /**
  mysql_pconnect()  为常连接。它和mysql_connect 的区分是 前者在多进度的WEB服务器上成效相比好。但也许有弱点正是在有关业务和数码表锁方面。实际情况请查看自个儿的手册。
  */
  if(!$this->connid = @$func($dbhost, $dbuser, $dbpw))
  {
   $this->halt('Can not connect to MySQL server');
  }
  // 当mysql版本为4.1之上时,启用数据库字符集设置
  if($this->version() > '4.1' && $CONFIG['dbcharset'])
        {
   mysql_query("SET NAMES '".$CONFIG['dbcharset']."'" , $this->connid);
  }
  // 当mysql版本为5.0之上时,设置sql mode,mysql5数据库带了字符集格局。设置下就好
  if($this->version() > '5.0')
  {
   mysql_query("SET sql_mode=''" , $this->connid);
  }
  if($dbname)
  {
   if([email=!@mysql_select_db($dbname]!@mysql_select_db($dbname[/email] , $this->connid))
   {
    $this->halt('Cannot use database '.$dbname);
   }
  }
  return $this->connid;
mg4377娱乐手机版:phpcms学习总计,phpcms缓存总计。}
/**
* 选取数据库
* @param string 数据库名
*/
function select_db($dbname)
{
  return mysql_select_db($dbname , $this->connid);
}
/**
* 执行sql语句
* @param string sql语句
* @param string 默以为空,可选值为 CACHE UNBUFFERED
* @param int Cache以秒为单位的生命周期
* @return resource
*/
function query($sql , $type = '' , $expires = 3600, $dbname = '')
{
  $func = $type == 'UNBUFFERED' ? 'mysql_unbuffered_query' : 'mysql_query';
  /**
  mysql_unbuffered_query 效用越来越好。节外省部存款和储蓄器 看手册
  */
  if(!($query = $func($sql , $this->connid)) && $type != 'SILENT')
  {
   $this->halt('MySQL Query Error', $sql);
  }
  $this->querynum ;
  return $query;
}
/**
* 试行sql语句,只收获一条记下
* @param string sql语句
* @param string 默以为空,可选值为 CACHE UNBUFFERED
* @param int Cache以秒为单位的生命周期
* @return array
*/
function get_one($sql, $type = '', $expires = 3600, $dbname = '')
{
  $query = $this->query($sql, $type, $expires, $dbname);
  $rs = $this->fetch_array($query);
  $this->free_result($query);
  return $rs ;
}
/**
* 从结果聚焦获得一行作为关周密组
* @param resource 数据库查询结果财富
* @param string 定义再次来到类型
* @return array
*/
function fetch_array($query, $result_type = MYSQL_ASSOC)
{
  return mysql_fetch_array($query, $result_type);
}
/**
* 猎取前贰回 MySQL 操作所影响的笔录行数
* @return int
*/
function affected_rows()
{
  return mysql_affected_rows($this->connid);
}
/**
* 获得结果聚集央银行的数据
* @return int
*/
function num_rows($query)
{
  return mysql_num_rows($query);
}
/**
* 重临结果集中字段的数目
* @return int
*/
function num_fields($query)
{
  return mysql_num_fields($query);
}
    /**
* @return array
*/
function result($query, $row)
{
  return @mysql_result($query, $row);
}
function free_result($query)
{
  return mysql_free_result($query);
}
/**
* 获得上一步 INSERT 操作发生的 ID
* @return int
*/
function insert_id()
{
  return mysql_insert_mg4377娱乐手机版,id($this->connid);
}
    /**
* @return array
*/
function fetch_row($query)
{
  return mysql_fetch_row($query);
}
    /**
* @return string
*/
function version()
{
  return mysql_get_server_info($this->connid);
}
function close()
{
  return mysql_close($this->connid);
}
    /**
* @return string
*/
function error()
{
  return @mysql_error($this->connid);
}
    /**
* @return int
*/
function errno()
{
  return intval(@mysql_errno($this->connid)) ;
}
/**
mysql_errno()  函数也蛮好使的哦。自个儿试下
*/
    /**
* 呈现mysql错误消息
*/
function halt($message = '', $sql = '')
{
  exit("MySQL Query:$sql <br> MySQL Error:".$this->error()." <br> MySQL Errno:".$this->errno()." <br> Message:$message");
}
}
?>
PHPCMS的文本缓存达成:
<?php
defined('IN_PHPCMS') or exit('Access Denied');
/**
其一文件之中全部都以关于生成文书缓存的函数。文本缓存是个好东西。一般的类型,我们用不着内部存款和储蓄器缓存 : memcached  ,文本解决。
原理是这么的: 大家在后台是还是不是能够安装重重关于网址的参数。而那个参数好多都以定位的。就不调换的。都存到咱的数据库上。而我们先后这里吗
历次都要拜访数据库读出参数来拓展大家先后中的操作。首先数据库查询是个很耗硬盘IO能源的三个东西,所以文本缓存刚好能缓慢解决数据库那边的承重。
我们在程序初阶就把数据Curry面的配置都转发为数组 等  放到  php文件之中。那样我们得以平昔访问php文件而不用每便都访问数据库了。  php文本缓存其实成了
大家先后和数据库的一在那之中间件。 所以大家团结写自身的文本缓存的时候其实要兑现的很简短:  读数据库  ->  写到PHP文件 ->  程序中include
来吧。初阶文本缓存学习
*/
function cache_all()  //生成全体缓存的总操作函数
{
cache_table(); //生成所有的数据库表名,表名是凭仗数据Curry面当前的申明而调换。请看这几个函数的详细分析
require_once PHPCMS_CACHEDI君越.'table.php'; //包蕴表常量
cache_common();
cache_member_group();
$modules = cache_module();
$channelids = cache_channel(0);
$keyids = array_merge($modules, $channelids);
foreach($keyids as $keyid)
{
  $catids = cache_categorys($keyid);
  if(is_array($catids))
  {
   foreach($catids as $catid)
   {
    cache_category($catid);
   }
  }
}
cache_type(0);
return TRUE;
}
function cache_common()
{
global $db;
$query = $db->query("SELECT module,name,iscore,iscopy,isshare,moduledir,moduledomain FROM ".TABLE_MODULE." WHERE disabled=0"); //查询全部能用的模块
while($r = $db->fetch_array($query))
{
  $r['linkurl'] = '';
  if($r['module'] != 'phpcms' && $r['iscopy'] == 0) $r['linkurl'] = linkurl($r['moduledomain'] ? dir_path($r['moduledomain']) : $r['moduledir'].'/');
  //假设模块存在目录的就取它目录地址
  unset($r['moduledomain']);
  $key = $r['module'];
  $data[$key] = $r;
}
$CACHE['module'] = $data; //存到缓存数组,等一下协同把 $CACHE 数组写到文本里去
$data = array();
$query = $db->query("SELECT channelid,module,channelname,channeldir,channeldomain,channelpic,introduce,style,islink,linkurl,cat_html_urlruleid,item_html_urlruleid,special_html_urlruleid,cat_php_urlruleid,item_php_urlruleid,special_php_urlruleid FROM ".TABLE_CHANNEL." WHERE disabled=0 OPAJERODETucson by listorder"); //罗列能用的频段列表
while($r = $db->fetch_array($query))
{
  $r['linkurl'] = linkurl($r['linkurl']);
  $key = $r['channelid'];
  $data[$key] = $r;
}
$CACHE['channel'] = $data; //存到缓存数组
$data = array();
    $r = $db->get_one("SELECT setting FROM ".TABLE_MODULE." WHERE module='phpcms'");
$CACHE['phpcms'] = unserialize($r['setting']);
//查询 phpcms那些模块的装置音信,我们能够看下数据库这一个表内容。setting 字段里面包车型地铁消息是透过serialize 函数窜行化的。
//所以抽出的内容要unserialize 反窜行.作者是挺喜欢使用serialize 函数的。他能够达成把三个数组存到数据库或把一个目的存到数据库。或是拿来GET传递都行。
//太强了。我们能够试用下。或者您项目某些地点供给用到啊。
$fields = array();
$result = $db->query("SELECT * FROM ".TABLE_FIELD." O锐界DE库罗德 BY 田野先生id"); //下栽模块的新闻,请本人看下那么些表的数额就领悟
    while($r = $db->fetch_array($result))
{
  $tablename = $r['tablename'];
  $fields[$tablename] .= ','.$r['name'];
}
$CACHE['field'] = $fields;
cache_write('common.php', $CACHE); //早先把$CACHE 数组写到 common.php 那一个文件缓存里。大家能够自个儿去开荒这么些文件看下内容。一切了解
    return $CACHE;
}
function cache_update($action='')//更新文本缓存。最棒在后台操作使用。因为PHP的文书flock 文件锁在好几平台采纳不是很好。会冒出多用户同写贰个文书从而破坏缓存文件
{
global $db;
$data=array();
switch($action)
{
  case 'keylink';
   $query=$db->query("SELECT linktext,linkurl FROM ".TABLE_KEYLINK." where passed=1");
   while($r=$db->fetch_array($query)){
      $data[]=$r;
   }
  break;
  case 'reword';
   $query = $db->query("SELECT word,replacement FROM ".TABLE_REWORD." where passed=1");
   while($r = $db->fetch_array($query))
   {
    $data[]=$r;
   }
  break;
  default:
   $actions = array('keylink','reword');
   array_map('cache_update', $actions);
   return TRUE;
}
cache_write('cache_'.$action.'.php', $data);
return $data;
}
function cache_table()
{
global $db,$CONFIG;
$query = $db->query("SHOW TABLES FROM `".$CONFIG['dbname']."`");
/**
来得数据Curry面包车型大巴装有表名
*/
while($r = $db->fetch_row($query))
{
  $table = $r[0];
  if(preg_match("/^".$CONFIG['tablepre']."/i", $table)) //寻觅表前缀等于 $CONFIG['tablepre'] (在config.inc.php里设置) @@表前缀还应该有这几个效果 嘿嘿
  {
   $tablename = str_replace($CONFIG['tablepre'], 'table_', $table);
   $data[$tablename] = $table;    //  $data['table_xx'] = xx; 方式   只好意会下了
  }
}
$db->free_result($query);  //$db->free_result()  那么些类格局其实是掉用了函数:mysql_free_result() 函数 首尽管为着清除数据库大的询问而攻陷的内部存储器。照旧有要求的啊
if(!is_dir(PHPCMS_CACHEDIR)) // 常量 PHPCMS_CACHEDI奥迪Q7 在 common.inc.php 里面定义的。我们不记得了去探望吧。是存放在phpcms 缓存目录的路子,这里意思是:倘诺缓存目录不存在
{
  dir_create(PHPCMS_CACHEDIENCORE); //假诺缓存目录不设有那么就创设
  dir_create($CONFIG['templatescachedir']); //成立编写翻译后的PHP模板目录,有关phpcms模板引擎编写。在下一章合适就开讲
  /**
  dir_create() 函数为创建 目录函数。PHPCMS自个儿包裹的,刚看了下。phpcms 挺强。那一个函数还足以透过ftp 来创建目录。那样就能够缓慢解决一些 开启了乌兰察布方式下的服务器对于开创目录等出现的主题素材
  因为涉及到PHP FTP 知识。所以筹划解聊起下边再说。
  */
}
cache_write('table.php', $data , 'constant'); //许多朋友说找不到phpcms 表常量在这里定义的。正是在此地。
/**
cache_write() 函数在global.func.php里面定义的。是把 已经从数额库收取来的数组音信写到 PHP文本上去。@@文本缓存关键的一步  废话少说上菜:
  function cache_write($file, $string, $type = 'array')
  {
   if(is_array($string)) //检验 $string 内容是字符窜的啊还是数组的,是数组的那就一连 ..
   {
    $type = strtolower($type);  
    if($type == 'array')//然后再推断那一个函数的方式标致 ,是或不是为数组格局,默感到数组方式
    {
     $string = "<?php/n return ".var_export($string,TRUE).";/n?>";
     //这一个太主要了。因为大家把数据库的新闻写到文本上去的时候。是以适合PHP语法的格式写进去的。为何吗?@@ 十三分废话,因为只要不是以PHP格式写到文件之中去
     那么这么些PHP文件怎么能给大家include 进程序运转调用呢? 呵呵。 知道这点就着实知道文本缓存的贯彻了。忒简单。 这里运用了个小技巧:使用了 var_export() 函数
     那些函数会再次回到两个变量的字符窜格局。那么些函数太有支持了。要是未有这么些函数,大家还要和睦想办法落到实处啊。自个儿写一遍文本缓存就知道了。会境遇这一个主题材料的。 '/n' 那些是
     文本文件的换行。初学者 别把<br> 和 '/n' 搞混罗。 四个是html 的 贰个是文件文件的
    }
    elseif($type == 'constant') //以内容情势
    {
     $data='';
     foreach($string as $key => $value) $data .= "define('".strtoupper($key)."','".addslashes($value)."');/n";
     $string = "<?php/n".$data."/n?>";
     假如以内容情势的话。就不是写数组到文本里面了。而是把内容都定义成常量。
    }
   }
   $strlen = file_put_contents(PHPCMS_CACHEDIR.$file, $string);//file_put_contents()函数 是PHP5才支撑的 功用最佳。建议采取
   chmod(PHPCMS_CACHEDIR.$file, 0777); 设置目录 为可读可写可举办
   return $strlen; //重返写到文本的字节数
  }
  
  再说多一个读 缓存文件的操作函数  :上菜
  function cache_read($file, $mode = 'i')
   {
    $cachefile = PHPCMS_CACHEDIR.$file;
    if(!file_exists($cachefile)) return array();
    return $mode == 'i' ? include $cachefile : file_get_contents($cachefile);
   }
   读缓存其实正是 include php缓存文件。 讲完离开
*/
return $data;
}
/**
phpcms 的有所数据库表名 都用依据数据库当前的表名来用常量来拓展定义。作者认为那样设计不是很好。相当不够利索:举个例子借使大家转移数据库的二个表名的话。
那么会合世找不到表的错误新闻。而且想要修复还很费力。正是说无法随意改动表名了。不推荐大家这么写。大家得以把表名都定义在三个PHP文件之中。那样大家今后
要改有些表名,就很有益于了。
*/
function cache_module($module = '')
{
global $db;
if($module)
{
  $r = $db->get_one("SELECT setting,module,name,iscopy,moduledir,moduledomain FROM ".TABLE_MODULE." WHERE module='$module'"); //模块具体消息
  if($r['setting'])
  {
   $setting = unserialize($r['setting']); //讲过了反窜行。因为中间新闻是窜行化后再存到数据库的
  }
  $setting['name'] = $r['name'];
  $setting['moduledir'] = $r['moduledir'];
  $setting['moduledomain'] = $r['moduledomain'];
  $setting['linkurl'] = '';
  if($r['module'] != 'phpcms' && $r['iscopy'] == 0)
  {
   $setting['linkurl'] = linkurl($r['moduledomain'] ? dir_path($r['moduledomain']) : $r['moduledir'].'/');
            cache_categorys($module);
  }
  unset($r['moduledomain']);
  cache_write($module.'_setting.php', $setting);
  return $setting;
}
else
{
  $query = $db->query("SELECT module FROM ".TABLE_MODULE." WHERE disabled=0 ORDER by moduleid");
  while($r = $db->fetch_array($query))
  {
   cache_module($r['module']);
   $modules[] = $r['module'];
        }
  return $modules;
}
}
function cache_channel($channelid=0)
{
global $db;
if($channelid)
{
  $data = $db->get_one("SELECT * FROM ".TABLE_CHANNEL." WHERE channelid=$channelid");
  if($data && !$data['islink'])
  {
   if($data['setting'])
   {
          $setting = unserialize($data['setting']);
    unset($data['setting']);
    $data = is_array($setting) ? array_merge($data, $setting) : $data;
   }
   $data['linkurl'] = linkurl($data['linkurl']);
   cache_write('channel_'.$channelid.'.php', $data);
   cache_categorys($channelid);
   return $data;
  }
    }
else
{
  $query = $db->query("SELECT channelid FROM ".TABLE_CHANNEL." WHERE islink=0 AND disabled=0 ORDER by channelid");
  while($r = $db->fetch_array($query))
  {
   cache_channel($r['channelid']);
   $channelids[] = $r['channelid'];
  }
  return $channelids;
}
}
function cache_categorys($keyid)
{
global $db,$PHPCMS,$CHANNEL;
$urlpre = '';
if(is_numeric($keyid))
{
  $keyid = intval($keyid);
  $module = $CHANNEL[$keyid]['module'];
        $sql = " channelid=$keyid ";
}
else
{
        $sql = " module='$keyid' ";
}
$catids = $data = array();
    $query = $db->query("SELECT module,channelid,catid,catname,style,introduce,catpic,islink,catdir,linkurl,parentid,arrparentid,parentdir,child,arrchildid,items,itemordertype,itemtarget,ismenu,islist,ishtml,htmldir,prefix,urlruleid,item_prefix,item_html_urlruleid,item_php_urlruleid FROM ".TABLE_CATEGORY." WHERE $sql ORDER by listorder,catid");
    while($r = $db->fetch_array($query))
{
  $r['linkurl'] = str_replace($PHPCMS['index'].'.'.$PHPCMS['fileext'], '', $r['linkurl']);
     $r['linkurl'] = $urlpre ? preg_replace("|^".$urlpre."|", '', $r['linkurl']) : linkurl($r['linkurl']);
  $catid = $r['catid'];
        $data[$catid] = $r;
  $catids[] = $catid;
    }
if($data) cache_write('categorys_'.$keyid.'.php', $data); //写缓存罗。
return $catids;
}
function cache_category($catid)
{
global $db,$PHPCMS;
if(!$catid) return FALSE;
    $data = $db->get_one("SELECT * FROM ".TABLE_CATEGORY." WHERE catid=$catid");
$setting = unserialize($data['setting']);
unset($data['setting']);
$data = is_array($setting) ? array_merge($data, $setting) : $data;
$data['linkurl'] = linkurl(str_replace($PHPCMS['index'].'.'.$PHPCMS['fileext'], '', $data['linkurl']));
cache_write('category_'.$catid.'.php', $data);
return $data;
}
function cache_type($keyid=0)
{
global $db;
if($keyid)
{
     $result = $db->query("SELECT * FROM ".TABLE_TYPE." WHERE keyid='$keyid'");
     $data = array();
     while($r = $db->fetch_array($result))
     {
   $r['introduce'] = $r['introduce']? $r['introduce']:' ';
      $data[$r['typeid']] = $r;
     }
     if($data)
     {
   cache_write('type_'.$keyid.'.php', $data);
     }
  return $data;
}
else
{
  $modules = array();
  $query = $db->query("SELECT module FROM ".TABLE_MODULE." WHERE disabled=0 ORDER by moduleid");
  while($r = $db->fetch_array($query))
  {
   $modules[] = $r['module'];
        }  
  $channelids = array();
  $query = $db->query("SELECT channelid FROM ".TABLE_CHANNEL." WHERE islink=0 AND disabled=0 ORDER by channelid");
  while($r = $db->fetch_array($query))
  {
   $channelids[] = $r['channelid'];
  }
  $modulechannels = array_merge($modules,$channelids);
  foreach($modulechannels as $m)
  {
   $result = $db->query("SELECT * FROM ".TABLE_TYPE." WHERE keyid='$m'");
   $TYPE = array();
   while($r = $db->fetch_array($result))
   {
    $r['introduce'] = $r['introduce']? $r['introduce']:' ';
    $TYPE[$r['typeid']] = $r;
   }
   cache_write('type_'.$m.'.php',$TYPE);
  }
  return $modulechannels;  
}
}
function cache_member_group()
{
global $db;
$query = $db->query("SELECT * FROM ".TABLE_MEMBER_GROUP." OLX570DE帕杰罗 BY groupid"); //用户组信息
while($r = $db->fetch_array($query))
{
  $groupid = $r['groupid'];
  cache_write('member_group_'.$groupid.'.php', $r);
  $data[$groupid] = $r;
}
cache_write('member_group.php', $data); //明白了吧。写缓存罗
return $data;
}
function cache_banip()
{
global $db,$PHP_TIME;
$result = $db->query("SELECT ip,overtime FROM ".TABLE_BANIP." WHERE ifban=1 and overtime>=$PHP_TIME order by id desc ");
while($r = $db->fetch_array($result))
{
  $data[] = array('ip'=>$r['ip'],'overtime'=>$r['overtime']);
}
$db->free_result($result);
cache_write('banip.php', $data);
return $data;
}
?>

科举夺魁

魔法师


武将

科举夺魁

尘间奇侠',
  'autoupdate' => '10',
  'name' => '问吧',
  'moduledir' => 'wenba',
  'moduledomain' => '',
  'linkurl' => '/opensource/phpcms2007_sp6_gbk/phpcms/wenba/',
);
?>

武将

include/global.func.php
履新模块设置函数
function module_setting($module, $setting)
{
    global $db,$MODULE,$LANG;
    if(!is_array($setting) || !array_key_exists($module,$MODULE)) return FALSE;
    if(isset($setting['moduledomain']))
    {
        $moduledomain = $setting['moduledomain'];
        $db->query("UPDATE ".TABLE_MODULE." SET moduledomain='$moduledomain' WHERE module='$module'");
        unset($setting['moduledomain']);
    }
    $setting = addslashes(serialize(new_stripslashes($setting)));
    //将有些模块的多少个设置的值经数组种类化今后保存在贰个字段setting中
    $db->query("UPDATE ".TABLE_MODULE." SET setting='$setting' WHERE module='$module'");
    cache_module($module);
    cache_common();
    return TRUE;
}

人间奇侠',
  'autoupdate' => '10',
  'name' => '问吧',
  'moduledir' => 'wenba',
  'moduledomain' => '',
  'linkurl' => '/opensource/phpcms2007_sp6_gbk/phpcms/wenba/',
);
?>

c.在动态页面里面发生静态的缓存文件
与b的缓存原理类似,只是此处生成的公文名是基于总计$PHP_SELF与$PHP_QUE宝马X3YST瑞鹰ING的md5值生成的公文名,相对于具备php动态页面来讲都以同样的,那几个考虑相比较精典,值得借签
以问吗模块为例进行验证
文件调用顺序为:index.php -> js.php -> ad.php -> global.func.php

此目录下有个index.php文件,推断当前目录下是或不是留存名叫index_cache.html的文本,若是有,则一贯包罗此文件,倘若不设有此文件,则动态地读取完数据后保存在index_cache.html文件,以备下一次接纳

include/global.func.php
更新模块设置函数
function module_setting($module, $setting)
{
    global $db,$MODULE,$LANG;
    if(!is_array($setting) || !array_key_exists($module,$MODULE)) return FALSE;
    if(isset($setting['moduledomain']))
    {
        $moduledomain = $setting['moduledomain'];
        $db->query("UPDATE ".TABLE_MODULE." SET moduledomain='$moduledomain' WHERE module='$module'");
        unset($setting['moduledomain']);
    }
    $setting = addslashes(serialize(new_stripslashes($setting)));
    //将某些模块的七个设置的值经数组类别化今后保存在贰个字段setting中
    $db->query("UPDATE ".TABLE_MODULE." SET setting='$setting' WHERE module='$module'");
    cache_module($module);
    cache_common();
    return TRUE;
}

编辑:mg4377娱乐手机版 本文来源:mg4377娱乐手机版:phpcms学习总计,phpcms缓存总计

关键词: