В связке 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