Практика подключения к базе данных PHP - PullRequest
4 голосов
/ 01 апреля 2010

У меня есть сценарий, который подключается к нескольким базам данных (Oracle, MySQL и MSSQL), каждое подключение к базе данных может не использоваться при каждом запуске сценария, но все они могут использоваться в одном выполнении сценария. У меня такой вопрос: «Лучше ли подключаться ко всем базам данных один раз в начале скрипта, даже если все соединения могут не использоваться. Или лучше подключаться к ним по мере необходимости, единственная проблема в том, что мне нужно иметь вызов соединения в цикле (чтобы соединение с базой данных было новым для X раз в цикле).

Да, пример кода № 1:

// Connections at the beginning of the script
$dbh_oracle = connect2db();
$dbh_mysql  = connect2db();
$dbh_mssql  = connect2db();

for ($i=1; $i<=5; $i++) {
   // NOTE: might not use all the connections
   $rs = queryDb($query,$dbh_*); // $dbh can be any of the 3 connections
}

Да, пример кода № 2:

// Connections in the loop
for ($i=1; $i<=5; $i++) {
   // NOTE: Would use all the connections but connecting multiple times
   $dbh_oracle = connect2db();
   $dbh_mysql  = connect2db();
   $dbh_mssql  = connect2db();

   $rs_oracle = queryDb($query,$dbh_oracle);
   $rs_mysql  = queryDb($query,$dbh_mysql);
   $rs_mssql  = queryDb($query,$dbh_mssql);
}

теперь я знаю, что вы можете использовать постоянное соединение, но будет ли это одно соединение открытым для каждой базы данных в цикле? Например, mysql_pconnect () , mssql_pconnect () и adodb для метода постоянного подключения Oracle . Я знаю, что постоянное соединение также может быть источником ресурсов, и я ищу лучшую производительность / практику.

Вот хороший пост на , почему постоянные соединения могут вызвать проблемы

Ответы [ 2 ]

15 голосов
/ 01 апреля 2010

Используйте ленивый класс-оболочку подключения:

class Connection
{
    private $pdo;
    private $dsn;

    public __construct($dsn)
    {
        $this->dsn = $dsn;
    }

    public query($sql)
    {
        //the connection will get established here if it hasn't been already
        if (is_null($this->pdo))
            $this->pdo = new PDO($this->dsn);

        //use pdo to do a query here

    }
}

Надеюсь, вы уже используете PDO. Если нет, вы должны быть. PDO не зависит от базы данных. Если вы сделали это с использованием процедурных функций, вам нужно создать новый класс для каждого типа базы данных.

В любом случае, это всего лишь скелет (например, вы хотите добавить опцию $params в query()), но у вас должна получиться идея. Соединение предпринимается только при звонке query(). Построение объекта не создает связи.

В качестве отступления рассмотрим использование Doctrine . Он имеет ленивые связи и вообще облегчает жизнь.

2 голосов
/ 01 апреля 2010

Лучшее правило производительности / практики простое: подключайтесь только к одной базе данных.

Что касается соединений - попробуйте реализовать некоторый класс доступа к базе данных. Который может подключаться автоматически по требованию.

...