【问题标题】:Codeigniter Load Database in Construct vs Load Database in FunctionCodeigniter 在构造中加载数据库与在函数中加载数据库
【发布时间】:2018-06-07 17:57:37
【问题描述】:

对于我所做的每个项目,我总是在我的构造函数中加载数据库配置,如下所示

public function __construct() {
    parent::__construct();
    $this->load->database();
}

出于某种原因,我想为一个模型中的每个功能加载不同的配置,如下所示

class Something_model extends CI_Model {

    public function __construct() {
        parent::__construct();
    }

    public function getAll() {
        $this->load->database('DB1', TRUE);
        // some code to be executed
    }

    public function getPart() {
        $this->load->database('DB2', TRUE);
        // some code to be executed
    }
}

我需要一些关于加载数据库配置的新方法的建议。当我在每个函数中加载数据库时是否有任何性能问题?或者使用起来安全吗?

另外,有什么建议可以在一个模型中为不同的功能调用不同的数据库吗?

【问题讨论】:

    标签: php database codeigniter


    【解决方案1】:

    这样做您总是会遇到一些性能损失,这只是课程的标准。多少可以通过测试确定,但也许 CI 分析器可以帮助您弄清楚这一点。

    但是,如果您只使用几个不同的数据库,并且经常使用它们,您可能会受益于在 MY_Controller 中全局初始化它们,这样您就不必在每次调用函数时都初始化连接。

    class MY_Controller extends CI_Controller {
        public $DB1, $DB2;
    
        public function __construct() {
            parent::__construct();
            $this->DB1 = $this->load->database('DB1', TRUE);
            $this->DB2 = $this->load->database('DB2', TRUE);
        }
    
    }
    
    class Some_controller extends MY_Controller {
    
        public function __construct() {
            $this->load->model('somemodel');
        }
    
    }
    
    //https://www.codeigniter.com/userguide3/database/connecting.html#connecting-to-multiple-databases
    class Some_model extends CI_Model {
    
        public function access_db_1() {
            $this->DB1->query('...');
        }
    
        public function access_db_2() {
            $this->DB2->query('...');
        }
    
    }
    

    当然,如果您不需要多个配置,您可以:

    您不需要创建单独的数据库配置,如果您只 需要在同一连接上使用不同的数据库。你可以 需要时切换到不同的数据库,如下所示:

    $this->db->db_select($database2_name);

    【讨论】:

      【解决方案2】:

      我认为它可以保存使用,在不同的功能上使用不同的数据库配置应该没有问题,但我也期望一些性能差异,因为你的每个功能都会建立不同的数据库连接

      【讨论】:

        【解决方案3】:

        在每个函数中加载数据库时是否存在性能问题?

        没有。一点也不。每个功能都单独处理。所以数据库连接没有任何性能问题。除非

        1. 与远程服务器的数据库连接
        2. DB is not fully compatible with PHP。 (意味着 MySQL 比 Oracle 处理得更快)
        3. Worst case memory leak in code

        使用安全吗?

        无论您使用什么与 CodeIgniter 相关联的方法都是安全的。继续使用他们的内置函数/方法和care about their security methods


        另外,有什么建议可以在一个模型中为不同的功能调用不同的数据库吗?

        是的,有很多。但是没有标准的(这样做)方式。你现在拥有的对我来说也很完美。甚至您也可以在 config.php 中创建这些方法并包含在您的模型中。但是所有这些都没有什么不同。


        建议

        如果您有多个 DB 连接,请将 DB1 保留为默认连接,并在 __construct 中使用 $this->load->database(); 加载它。并且每当您需要加载第二个数据库连接时,请使用$this->load->database('DB2', TRUE);

        【讨论】:

          猜你喜欢
          • 2012-01-04
          • 2013-01-13
          • 1970-01-01
          • 2017-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多