Oracle DB Yii2 PHP

В связке MySQL PHP Yii2 все понятно, но что делать если необходимо осуществить интеграцию с каким-нибудь сервисом, например биллингом, который реализован на Oracle DB?

Настройка будет производиться для XAMPP под Windows. Пробовался вариант под Ubuntu 18.04 но с ней что-то не пошло. Возможно в будущем разберемся в чем проблема, но сейчас пока так.

1. Установка драйверов

Основная проблема здесь заключается в том, что даже если установить расширения для php и включить их в php.ini, это не гарантирует, что вы сможете подключиться к БД. Проблема в драйвера в системе.

Чтобы установить драйвера:

  1. Скачиваем драйвера с оф. сайта (необходима регистрация). Instant-client Download
  2. Распаковываем в какую-нибудь папку (например c:\instantclient)
  3. Добавляем путь c:\instantclient в PATH системы
  4. Перезагружаемся
  5. В файле php.ini раскомментируем строчки
    ;extension=php_oci8.dll ; use with oracle 10gR2 instant Client
    ;extension=php_oci8_11g.dll  ; use with Oracle 11gR2 Instant Client
  6. Перезапускаем сервер

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

Вопрос-ответ на форуме Yii2

Oracle и Yii2

Leave a comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.