В связке MySQL PHP Yii2 все понятно, но что делать если необходимо осуществить интеграцию с каким-нибудь сервисом, например биллингом, который реализован на Oracle DB?
Настройка будет производиться для XAMPP под Windows. Пробовался вариант под Ubuntu 18.04 но с ней что-то не пошло. Возможно в будущем разберемся в чем проблема, но сейчас пока так.
1. Установка драйверов
Основная проблема здесь заключается в том, что даже если установить расширения для php и включить их в php.ini, это не гарантирует, что вы сможете подключиться к БД. Проблема в драйвера в системе.
Чтобы установить драйвера:
- Скачиваем драйвера с оф. сайта (необходима регистрация). Instant-client Download
- Распаковываем в какую-нибудь папку (например c:\instantclient)
- Добавляем путь c:\instantclient в PATH системы
- Перезагружаемся
- В файле php.ini раскомментируем строчки
;extension=php_oci8.dll ; use with oracle 10gR2 instant Client
;extension=php_oci8_11g.dll ; use with Oracle 11gR2 Instant Client - Перезапускаем сервер
2. Подключение к БД
Для подключения можно использовать пакет neconix/yii2-oci8
Как описано в документации, подключиться можно используя компонент db, но поместив настройки в отдельный файл db.php
$config = [ ... 'components' => [ ... 'db' => require(__DIR__ . '/db.php'), ... ] ];
return [ 'class' => 'neconix\yii2oci8\Oci8Connection', 'dsn' => 'oci:dbname=//192.168.0.1:1521/db.local;charset=AL32UTF8;', 'username' => 'user', 'password' => 'pass', 'attributes' => [ PDO::ATTR_PERSISTENT => true ], 'enableSchemaCache' => true, //Oracle dictionaries is too slow :(, enable caching 'schemaCacheDuration' => 60 * 60, //1 hour 'on afterOpen' => function($event) { /* A session configuration example */ $q = <<<SQL begin execute immediate 'alter session set NLS_SORT=BINARY_CI'; execute immediate 'alter session set NLS_TERRITORY=AMERICA'; end; SQL; $event->sender->createCommand($q)->execute(); } ];
3. Выполнение запросов
Запрос данных из таблицы (вьюшки)
$rows = (new Query()) ->select('*') ->from('TABLE_NAME') ->all(); var_dump($rows);
Вызов функции
$result = 0; $sql = "begin :result := SCHEME.PACKAGE.FUNCTION_NAME(:argument); end;"; $request = Yii::$app->db ->createCommand($sql) ->bindParam(":argument", $argument) ->bindParam(':result', $result) ->execute(); var_dump($result);
Полезные ссылки
Конфигурация Oracle на XAMPP на Windows