CI3搭建多站点

目的是:同一个项目,希望用不同的域名分开不同的子站点,例如后台管理admin.xxx.com,商城shop.xxx.com,接口 api.xxx.com等。

参考

http://codeigniter.org.cn/forums/thread-24073-1-1.html

文件夹目录

application下分别新建public、shop、admin文件夹。原来application目录下的所有文件,都复制一份到以上三个文件夹内。现在目标是shop、admin分别有自己的入口文件,能使用自己的model、libraries等等,同时也能调用public内的文件。

入口文件index.php

原先根目录下的index.php,复制到public目录中。修改以下地方:

//重新定义$system_path
$system_path = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'system';
//注释掉$application_folder和$view_folder的定义
//$application_folder = 'application';
//$view_folder = '';
//新增一个全局变量 PUBLIC_PATH
$public_path = dirname(__FILE__).DIRECTORY_SEPARATOR;
define('PUBLIC_PATH',$public_path);

shop目录下新建index.php,内容如下:

<?php
//定义application_folder和$view_folder
$application_folder = dirname(__FILE__);
$view_folder = dirname(__FILE__).DIRECTORY_SEPARATOR.'views';
//然后引用public目录的index.php
include dirname($application_folder).DIRECTORY_SEPARATOR.'public'.DIRECTORY_SEPARATOR.'index.php';

admin目录同理

loader

loader负责加载视图、模型、库等。现在需要重写loader。复制\system\core\Loader.phpshop目录的core目录,并且重名为MY_Loader.php。修改的内容如下:

protected $_ci_library_paths =    array(APPPATH, BASEPATH,PUBLIC_PATH);
protected $_ci_model_paths =    array(APPPATH,PUBLIC_PATH);
protected $_ci_helper_paths =    array(APPPATH, BASEPATH,PUBLIC_PATH);

也就是把之前定义的PUBLIC_PATH加入到model、library、helper路径中。
admincore也有一份相同的MY_Loader.php

站点配置

在windows系统、apache环境下的配置示例:

<VirtualHost *:80>
    DocumentRoot "D:\PHP\phpStudy\WWW\CI3-multi-site\application\shop"
    ServerName shop.ci3-multi-site.com
    ServerAlias
  <Directory "D:\PHP\phpStudy\WWW\CI3-multi-site\application\shop">
      Options FollowSymLinks ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
      Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "D:\PHP\phpStudy\WWW\CI3-multi-site\application\admin"
    ServerName admin.ci3-multi-site.com
    ServerAlias
  <Directory "D:\PHP\phpStudy\WWW\CI3-multi-site\application\admin">
      Options FollowSymLinks ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
      Require all granted
  </Directory>
</VirtualHost>

hosts文件:

127.0.0.1 shop.ci3-multi-site.com
127.0.0.1 admin.ci3-multi-site.com

测试

在shop站点的controller文件夹下有CI3默认有的Welcome.php,直接用里面的index()方法测试好了。

public function index(){
    $this->load->model('public_model');//这是public目录下的models里面的model
    $this->load->model('shop_model');//这是shop目录下的models里面的model
    $data_public = $this->public_model->get_data();//model里的方法,只是简单地返回字符串
    $data_shop = $this->shop_model->get_data();//同上
    echo $data_public.'  '.$data_shop;
    echo "<br>";

    $this->load->library('Shop_lib');//这是shop目录下的libraries里面的库
    $this->load->library('Public_lib');//这是public目录下的libraries里面的库
    $msg_shop = $this->shop_lib->get_msg();//库里的方法,简单返回字符串
    $msg_public = $this->public_lib->get_msg();//同上
    echo $msg_shop.' '.$msg_public;
}

然后访问shop.ci3-multi-site.com,可以看到这个控制器分别从自己以及public的model、libraries获取到了数据。

helper引用

例如现在要在public建立一个公共的public_helper,然后在子站点(比如admin)引用。
\application\public\helpers建立public_helper.php。然后在admin中的autoload.php配置:

$autoload['helper'] = array('public');

这样就会自动加载到公共的public_helper.php中的方法。

数据库加载的问题

配置冲突

在核心文件\system\database\DB.php,有这样的逻辑:
1. 先加载应用所在文件夹的\config\database.php文件(例如\application\admin\config\database.php).
2. 然后加载公共文件夹的\config\database.php文件(\application\public\config\database.php)
这样,如果2个配置文件存在同名的配置,就会发生冲突,公共配置会覆盖子站点配置。

自动加载database

在autoload配置文件(\admin\config\autoload.php),需要配置:

$autoload['libraries'] = array('database');

(可能是因为我改变了目录结构,导致CI3不会自动加载database库,结果在使用$this->db时遇到错误提示:Undefined property: 控制器::$db。)

静态文件引用

可以在根目录下建立文件夹,存放公共资源。例如根目录下新建resource
apache设置

<VirtualHost *:80>
    ServerName resource.ci3-multi-site.com
    DocumentRoot "D:\phpStudy\WWW\CI3-multi-site\resource"
    <Directory "D:\phpStudy\WWW\CI3-multi-site\resource">
        Options Indexes FollowSymLinks ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
        Header set Access-Control-Allow-Origin *
    </Directory>
</VirtualHost>

hosts设置

127.0.0.1  resource.ci3-multi-site.com

config中设置:

$config['resource_url'] = 'http://resource.ci3-multi-site.com/';

在页面中引用

<link rel="stylesheet" type="text/css" href="<?=config_item('resource_url')?>css/font.css">
<script src="<?=config_item('resource_url')?>lib/layui/layui.js" charset="utf-8"></script>

文件夹结构

文件夹结构

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值