用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2486|回复: 8
收起左侧

将以前的项目转为ci,有个问题不知道如何操作,请朋友进

[复制链接]
发表于 2012-10-9 14:40:22 | 显示全部楼层 |阅读模式
本帖最后由 lawzk 于 2012-10-9 15:22 编辑

由于对codeignter了解才几天,最近为了更好学习ci,所以把以前的一个项目转为ci框架。现在碰到一个问题,我不知道该如何下手解决。

我以前的程序有一个公共文件conn.php,作用是读取数据库的配置表信息。比如网站名称、上传路径、上传图片大小之类的,我以前的操作方法是读取该配置信息(得到一数组),通过Memcache方式写入缓存。以后在缓存有值的情况下,就可以不用读取数据库。我的服务器是win系统+apache2.1

问题1:

在ci中,在哪写入这个功能?config类?还是控制器中?

我的想法就是在一个公共的地方将数据库配置文件写入到缓存。这样我在其它地方可以直接调用。而不用每次从数据库中读取。
我现在的方法是放到一个控制器中。但我认为这并不是一个好的方案。假如这个控制器为A,上传的控制器为B,如果我正在上传某个文件之前服务器已经重启,这时缓存丢失。我上传时就得不到关于上传的一些配置信息。所以我想在每个涉及配置文件的地方都会检查这个缓存是否存在,不存在就从数据库中读,并存入缓存。存在的话,就直接取数据,这样就减少读取数据库的次数。我希望能得到这样一个解决方案。不知道我描述的是否被大家理解。

问题2:
看论坛的其它内容,都说ci支持memcached,而windows系统只支持memcache,我在网上找到一个方案:

网址如下:http://song3304.blog.163.com/blog/static/2826250620127300525142/

经测试可以使用。

现在似乎都具备了条件。就是不知道将这个全局缓存的程序放在什么地方。请这方面有经验的朋友帮忙解惑。感激不尽。

附:我用的是2.1.2版本。新版的memcache支持windows的memcache吗?
发表于 2012-10-9 21:17:00 | 显示全部楼层
扩展CI_Controller类 http://codeigniter.org.cn/user_guide/general/core_classes.html

没听懂问题二
 楼主| 发表于 2012-10-10 18:00:07 | 显示全部楼层
我是要操作数据库才能得到这个配置。就是说我这个配置是在数据库中的一个表中。扩展库可以实现吗?
发表于 2012-10-10 19:04:17 | 显示全部楼层
本帖最后由 Shengzhi 于 2012-10-10 19:05 编辑
lawzk 发表于 2012-10-10 18:00
我是要操作数据库才能得到这个配置。就是说我这个配置是在数据库中的一个表中。扩展库可以实现吗? ...

我的意思是扩展CI_Controller类,增加一个或多个方法,这样在所有的控制器都可以使用这些方法了,就像公用方法了。
在这些方法中对数据库进行操作。

例如
MY_Controller类继承于CI_Controller,你的控制器继承于MY_Controller。在MY_Controller中增加个options方法,这个方法对数据库进行操作,以后在每个控制器的方法中都可以使用options()方法获取你需要的信息了。

(扩展核心类)请看手册,恕我无法一一细说:http://codeigniter.org.cn/user_guide/general/core_classes.html

对数据库的操作请看手册.

 楼主| 发表于 2012-10-10 19:49:16 | 显示全部楼层
本帖最后由 lawzk 于 2012-10-10 19:51 编辑

为了简便,我简化了实际代码。

conn.php中代码如下:

$mem=new Memcache;
$mem->connect("127.0.0.1",11211);
$_config_arr=$mem->get('config');
//$_config_arr='';
if(!is_array($_config_arr)){
  //从数据库读取配置文件
  $query=mysql_query('select webname,domain,default_lang from config where id=1');
  if(mysql_num_rows($query)){
    $arr=mysql_fetch_array($query);
    $mem->set('config',$arr,0,0);
    $_config_arr=$mem->get('config');
  }
}

if(is_array($_config_arr)){
  $_webname=$_config_arr[webname];
  $_domain=$_config_arr[domain];
  $_default_lang=$_config_arr[default_lang];
}

后台每个页面都包含conn.php。只要执行一次,以后任何页面都不会再读数据库。直接从缓存中读取数据。除非服务器重启,缓存丢失。我只是想要实现这样的功能,即在一个地方加载配置文件,其它页面,从缓存中判断,如果未加载,则读数据库并存缓存。如果已加载,直接从缓存中读数据。这是我以前项目的实现方式。现在转为CI,我不知道该怎么处理。刚才想到,在autoload.php中配置,自动加载一个模型,在这个模型中实现?

如果每个页面都要通过控制器方法来操作,岂不是太麻烦?
 楼主| 发表于 2012-10-10 21:12:21 | 显示全部楼层
如果我定义了一个 MY_Controller,并在在构造函数中将配置数据读给一个变量$data。我如何在其它控制器中获取这个变量呢。

比如控制器中方法:

        public function config(){
                $this->load->view('public/config',xxx);      这里的xxx写在$data不行。
        }

我知道有个:$this->load->vars($data); 这个方式,这样在上面语句中就不用第二个参数。我想用指定的方式该如何写?非常感谢Shengzhi。似乎这个问题快解决了。
 楼主| 发表于 2012-10-10 21:27:12 | 显示全部楼层
还有一个问题。我以前没有创建MY_Controller时,是在控制器中的构造函数加载一个A模型。现在我在MY_Controller中加载了A模型。且在其它控制器继承MY_Controller。且在构造函数中使用:parent::__construct();继承父类的构造函数。请问我还要在控制器中在加载A模型吗。
发表于 2012-10-10 22:54:49 | 显示全部楼层
数据的话,在MY_Controller类中作为一个成员变量就可以了。
例如在MY_Controller中的构造函数里可以使用 $this->data = 'Your data';
在其他控制器中用$this->data就可以获取这个变量了;(因为其他是控制器从MY_Controller继承了嘛~)

如果确定在MY_Controller中加载了A模型,你的控制器继承于MY_Controller,那么在控制器中就不需要加载A模型了。(因为继承了嘛~)


其实都是面向对象问题。
另:吐槽,conn不妨改名为common,我不认为有人会知道conn是表示公用的意思。
 楼主| 发表于 2012-10-10 22:59:07 | 显示全部楼层
非常感谢Shengzhi。问题解决了。

本版积分规则