Новости
У цій статті я хочу розповісти про можливості, які надає 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 профайлинг.
Правда, недавно бачив інструкцію щодо виправлення цього недоліку , Але сам не пробував.
Як бачите, в використанні декількох БД немає нічого складного. Якщо виникли питання, задавайте, спробую відповісти 😉