Начало истории:
- есть 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г.
Тем ни менее спасибо, комменты на этом форуме очень близко подвели меня к разгадке