Страница 2 из 2

Re: Как правильно подключить ORACLE в OSPANEL 6 ?

Добавлено: 02 окт 2024, 15:40
QuackLa
Не знаю пригодятся ли кому-то результаты моих страданий двухдневных, но всё же опишу их.

Начало истории:
- есть osPanel v. 5 с чем-то
- не установлена, а перенесена на флешке со старого диска
- всё работало, писалось, запускалось. Как выяснилось не совсем всё
- в файлах панели лежал и instantclient_18_5, когда-то скачанный с https://www.oracle.com/database/technol ... ant-client

Проблема:
- на днях мне потребовалось написать код, который бы запускался планировщиком задач,
использовал события, слушателя, очереди.
Речь о Laravel, если что
- я его написал, точнее переделал из своих же наработок, за денёк.
- проверяю руками процесс сначала и всё везде работает, данные из биллинга (на Oracle) выгружаются, обрабатываются и всё должно быть гладко.
- засовываю код в метод __invoke() (на который реагируют планировщики и все обработчики) и бац, получаю ошибку Trying to access array offset on value of type bool
- удивляюсь, перепроверяю всё в ручном режиме, всё работает. Возвращаю в invoke и всё ломается.
В дальнешейм я пробовал и __construct и пытался обращаться к методу в контроллоре без использования invoke/construct - всё тщетно, код заваливался на запросе к базе.

Поиск решения:
- гугление длилось почти 2 дня
- по кусочкам я пришёл примерно к такой цепочке:
1. вероятно не совпадает версия oracle client с версией php и базы
2. как это решить? Обновить компоненты. Чем проще всего обновляться? Composer.
3. установка composer'a встаёт на дыбы, ибо PHP не инсталировался, а запускался из перенесённых файлов (на флешке).
4. ок, обновил osPanel, раз такое дело. Скачиваю и ставлю 6-ю версию.
Офигеваю с изменений, иду смотреть 30-ти минутный урок на youtube, с пояснениями.
Понял, принял, запустил.
5. результата это не дало, в логах получал ту же ошибку на том же месте.
6. пошёл опять гуглить. Переписывал всякие PATH (переменные винды), ребутался, поднимал переменные вверх - мартышкин труд всё это, в общем.
7. на текущем форуме, в этой ветке, наткнулся на то, что можно попробовать заменить oci.dll в OSPanel\modules\PHP...etc
Заменил - ничего не поменялось. Начал проверять методом тыка, как обычно. Удалил oci.dll из папки - внезапно extension oci вообще пропала из php.ini.
Думаю, ладно, а если попробывать папку instantclient_18_5, засовывать во все места в OSPanel.... Попробовал в home, в свой домен, в config - не срабатывает (проверяю через phpinfo() ,там версия client'а была 0.0.0.0)
8. В итоге плюнул, думаю, а что если...он же видит замену файла oci.dll в папке с PHP, но не видит явно остальные файлы библиотеки...В общем я взял всё содержимое папки и вкинул в PHP и... Оно заработало!

Окончательное решение:
В итоге, на windows 10, даром ему не нужны никакие переменные PATH
Всё что ему нужно, для работы с удалённой oracle БД (смежно с mysql или postgres):
-----------------------------------
- php должен быть инсталирован в систему, а не перенесён в виде набора файлов
-----------------------------------
- скачать client'а с сайта oracle
https://www.oracle.com/database/technol ... ant-client
Распаковать и содержимое папки "instantclient_18_5" вывалить в E:\OSPanel\modules\PHP-7.4\PHP (E: и PHP-7.4 это мой частный случай, конечно)
-----------------------------------
- в E:\OSPanel\config\PHP-7.4\default\templates\php.ini раскомментить:
extension   = redis
extension   = snmp
extension  = oci8_12c
Это, опять же, мой частный случай. Redis нужен для очередей, а snmp для работы со свитчами.
-----------------------------------
- конфиг в .env (для Laravel). Принципиально важно, чтобы переменные для DB отличались в файле ENV, иначе с двумя базами разом не поработать, на это я тоже потратит когда-то несколько дней...
DB_CONNECTION=mysql
DB_HOST_Local=MySQL-5.7
DB_PORT_Local=3306
DB_DATABASE_Local=yourNameDB
DB_USERNAME_Local=root
DB_PASSWORD_Local=

DB_HOST=db_ip_address (или домен)
DB_PORT=1521
DB_SERVICE_NAME=yourDB_SID
DB_DATABASE=orcl
DB_USERNAME=yourDBlogin
DB_PASSWORD=yourDBpassword

QUEUE_CONNECTION=redis
SESSION_LIFETIME=360
REDIS_HOST=redis-5.0
REDIS_URL=tcp://redis-5.0:6379?database=0
REDIS_HOST=redis
REDIS_DB=0
REDIS_PASSWORD=null
REDIS_PORT=6379
-----------------------------------
- конфиг в файле Laravel/config/database.php, в раздел 'connections':
        'oracle' => [
            'driver'         => 'oracle',
            'tns'            => env('DB_TNS', ''),
            'host'           => env('DB_HOST', ''),
            'port'           => env('DB_PORT', '1521'),
            'database'       => env('DB_DATABASE', ''),
            'service_name'   => env('DB_SERVICE_NAME', ''),
            'username'       => env('DB_USERNAME', ''),
            'password'       => env('DB_PASSWORD', ''),
            'charset'        => env('DB_CHARSET', 'AL32UTF8'),
            'prefix'         => env('DB_PREFIX', ''),
            'prefix_schema'  => env('DB_SCHEMA_PREFIX', ''),
            'edition'        => env('DB_EDITION', 'ora$base'),
            'server_version' => env('DB_SERVER_VERSION', '11g'),
            'load_balance'   => env('DB_LOAD_BALANCE', 'yes'),
            'dynamic'        => [],
        ],
-----------------------------------

P. S. файлик oci.dll , в modules\php\php-xx\ не был удалён, очевидно, раз я наткнулся на него в октябре 2024г.
Тем ни менее спасибо, комменты на этом форуме очень близко подвели меня к разгадке