Новости

Використання декількох баз даних в CodeIgniter

У цій статті я хочу розповісти про можливості, які надає PHP фреймворк CodeIgniter для одночасної роботи з декількома базами даних. Крім того, я провів невелике дослідження продуктивності.

Перш за все, поясню загальний принцип. У роботі з декількома базами даних немає нічого незвичайного і виняткового. Якщо ви пишете звичайний PHP скрипт (без використання фреймворків і бібліотек), то для роботи з двома БД потрібно просто створити два з'єднання.

Тобто викликати два рази функцію mysql_connect (якщо, звичайно, використовуєте MySQL).

Кожен виклик цієї функції поверне покажчик на з'єднання, використовуючи який ви зможете відправляти запити баз даних.

Це була теорія, а на практиці набагато зручніше використовувати вбудовані бібліотеки фреймворків для роботи з базами даних. Принцип роботи при цьому, звичайно, не змінюється, але працювати з ними значно зручніше.

Я розповім про підключення і використання декількох баз даних в CodeIgniter. Але, природно, це не єдиний фреймворк, який має вбудовані бібліотеки для роботи з декількома БД. Наприклад, недавно я читав статтю « Робота з декількома базами даних за допомогою ORM в Zend Framework ».

Як приклад розглянемо підключення до двох БД.

1) Вказуємо параметри підключення в файлі конфігурації.

Відкриваємо файл application / config / database.php і шукаємо блок з настройками підключення до бази.

$ Db [ 'default'] [ 'hostname'] = "localhost"; $ Db [ 'default'] [ 'username'] = "db_user"; $ Db [ 'default'] [ 'password'] = "db_pass"; $ Db [ 'default'] [ 'database'] = "db_name"; $ Db [ 'default'] [ 'dbdriver'] = "mysql"; $ Db [ 'default'] [ 'dbprefix'] = ""; $ Db [ 'default'] [ 'pconnect'] = FALSE; $ Db [ 'default'] [ 'db_debug'] = TRUE; $ Db [ 'default'] [ 'cache_on'] = FALSE; $ Db [ 'default'] [ 'cachedir'] = ""; $ Db [ 'default'] [ 'char_set'] = "utf8"; $ Db [ 'default'] [ 'dbcollat'] = "utf8_general_ci";

Як бачите, все було визначено відповідні установки знаходяться в двовимірному масиві. У першому індексі вказується назва групи параметрів даного підключення (в даному випадку default).

Змінюючи цю назву, ви можете визначити скільки завгодно груп парамеров. Тобто для роботи з другої БД копіюємо весь цей блок, змінюємо перший індекс і вказуємо параметри підключення до другої базі.

наприклад,

$ Db [ 'db2'] [ 'hostname'] = "localhost"; $ Db [ 'db2'] [ 'username'] = "db2_user_name"; $ Db [ 'db2'] [ 'password'] = "db2_pass"; $ Db [ 'db2'] [ 'database'] = "db2_name"; $ Db [ 'db2'] [ 'dbdriver'] = "mysql"; $ Db [ 'db2'] [ 'dbprefix'] = ""; $ Db [ 'db2'] [ 'pconnect'] = FALSE; $ Db [ 'db2'] [ 'db_debug'] = TRUE; $ Db [ 'db2'] [ 'cache_on'] = FALSE; $ Db [ 'db2'] [ 'cachedir'] = ""; $ Db [ 'db2'] [ 'char_set'] = "utf8"; $ Db [ 'db2'] [ 'dbcollat'] = "utf8_general_ci";

2) Підключаємося до потрібної базі.

Просто два рази використовуємо стандартний спосіб підключення до БД в CodeIgniter.

$ DB = $ this-> load-> database ( 'default', TRUE, TRUE); $ DB2 = $ this-> load-> database ( 'db2', TRUE, TRUE);

При цьому в першому параметрі вказуємо назву групи параметрів потрібного підключення. В даному випадку це 'default' і 'db2'.

Другий параметр в даному випадку обов'язково має дорівнювати TRUE. Він вказує чи повинен метод database повернути ID з'єднання. За замовчуванням цей параметр дорівнює FALSE, тому що в більшості випадків працювати потрібно тільки з однієї БД. Але якщо баз дві або більше, то за допомогою цих ID можна вказати якій базі відправляється запит.

Третій параметр не обов'язковий. З його допомогою ми вказуємо активувати чи ні клас Active Record.

3) Відправляємо запити.

Як я і говорив, якщо баз кілька, то для роботи з ними потрібно використовувати ID відповідних з'єднань.

Тобто якщо в разі однієї бази запит відправляється через об'єкт $ this.

$ This-> db-> query ( '...');

Те при роботі з двома базами відправка запиту буде виглядати так:

$ DB-> query ( 'select * from table_name'); $ DB2-> query ( 'select * from db2_table_name');

Як бачите, код навіть трохи скорочується.

Споживання ресурсів.

Думаю, не складно здогадатися, що підключення до другої базі займе якийсь час. Тому я вирішив провести невеликий тест.

Для цього я взяв стандартний дистрибутив CodeIgniter і в конструктор контролера додав операцію підключення до бази.

Після цього включив профайлинг в xDebug і визначив загальний час роботи скрипта і час, який пішов на створення з'єднань. Результат вийшов наступний.

Підключення до однієї БД.

Виклик php :: mysql_connect відбувається в методі CI_DB_mysql_driver-> db_connect і займає 4.32 мс.

При цьому загальний час роботи скрипта 131 мс.

Підключення до двох БД.

php :: mysql_connect викликається два рази (також з CI_DB_mysql_driver-> db_connect) і займає 5.99 мс.

Загальний час - 132 мс.

Звідси можна зробити простий висновок. MySQL дуже швидко створює з'єднання і тому робота одночасно з декількома базами на продуктивність практично не впливає.

До речі, навіть найпростіший запит (до однієї маленької таблиці без умов) займає близько 30 мс.

Мабуть, єдиний недолік в тому, що при використанні двох БД не працює вбудований в CodeIgniter профайлинг.

Правда, недавно бачив інструкцію щодо виправлення цього недоліку , Але сам не пробував.

Як бачите, в використанні декількох БД немає нічого складного. Якщо виникли питання, задавайте, спробую відповісти 😉

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: