Невозможно загрузить динамическую библиотеку 'oci8.so' (PHP 7.2)
После обновления PHP 7.1 до PHP 7.2 я не могу установить oci8. У меня есть эта ошибка:
root @ 3ab6027c8d95: / var / www # php -v
Предупреждение PHP: Запуск PHP: невозможно загрузить динамическую библиотеку 'oci8.so' (пробовал: /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so (libmql1.so: не могу открыть файл общего объекта: нет такого файла или каталога), /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so.so (/usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so.so: невозможно открыть общий объектный файл: нет такого файла или каталога)) в поле "Неизвестно" в строке 0
PHP 7.2.0 (cli) (сборка: 12 декабря 2017 г., 05:52:58) ( NTS) Copyright (c) 1997-2017 PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies с Zend OPcache v7.2.0, Copyright (c) 1999-2017, Zend Technologies
Я использую среду Docker, для этого я создал репозиторий github, он работает, если я использую версию 7.1 PHP ( shenron / docker-php-fpm: 7.2).
Я не понимаю, почему скрипт пытается запустить этот файл: /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so.so
,
На мой взгляд, есть две возможности; либо драйвер не совместим, либо pecl сегодня не может установить oci8.
У кого-нибудь такая же проблема?
Спасибо за помощь.
7 ответов
/usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so.so
является только вторым предположением об имени файла совместно используемой библиотеки. Вы можете смело игнорировать это.
Актуальная проблема: (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so (libmql1.so: cannot open shared object file: No such file or directory)
oci8.so
Само зависит от нескольких общих библиотек, вы можете использовать ldd
чтобы узнать, какие из них:
ldd /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so
linux-vdso.so.1 (0x00007ffc8bfe7000)
libclntsh.so.12.1 => /usr/local/instantclient/libclntsh.so.12.1 (0x00007fb9919e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb991641000)
libmql1.so => not found
libipc1.so => not found
libnnz12.so => not found
libons.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb99143d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb991139000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb990f1c000)
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007fb990d04000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb990afc000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb994bc8000)
libaio.so.1 => /lib/x86_64-linux-gnu/libaio.so.1 (0x00007fb9908fa000)
libclntshcore.so.12.1 => not found
Те .so
файлы, кажется, являются частью почтового файла в вашем хранилище. Запуск PHP, как это LD_LIBRARY_PATH=/usr/local/instantclient_12_1/ php
прекрасно работает внутри вашего контейнера. Вы должны переместить эти файлы в нормальное место.
Для любого, кто сталкивается с этим вопросом, вот правильный способ справиться с ним в Linux.
Шаг 1: получить оракулов
wget oracle-instantclient18.3-basic-18.3.0.0.0-1.x86_64.rpm
wget oracle-instantclient18.3-devel-18.3.0.0.0-1.x86_64.rpm
шаг 2: установить
yum install oracle-instantclient18.3-basic-18.3.0.0.0-1.x86_64.rpm
yum install oracle-instantclient18.3-devel-18.3.0.0.0-1.x86_64.rpm
шаг 3: настроить (сделать путь к библиотекам оракула доступным для обнаружения)
sudo sh -c "echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle.conf"
sudo ldconfig
тестовое задание
php -v
# and you should get something like
PHP 7.2.12 (cli) (built: Nov 6 2018 16:40:25)...
Если работает ldd /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so
дает вам что-то вроде этого с отсутствующими файлами:
ldd /usr/local/lib/php/extensions/no-debug-non-zts-20170718/oci8.so
linux-vdso.so.1 (0x00007ffc8bfe7000)
libclntsh.so.12.1 => /usr/local/instantclient/libclntsh.so.12.1 (0x00007fb9919e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb991641000)
libmql1.so => not found
libipc1.so => not found
libnnz12.so => not found
libons.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb99143d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb991139000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb990f1c000)
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007fb990d04000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb990afc000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb994bc8000)
libaio.so.1 => /lib/x86_64-linux-gnu/libaio.so.1 (0x00007fb9908fa000)
libclntshcore.so.12.1 => not found
Вы можете добавить папку в свой ldconfig следующим образом (другие читатели - ваш путь может отличаться):
echo /usr/local/instantclient_12_1/ > /etc/ld.so.conf.d/oracle-instantclient.conf
Тогда беги ldconfig
читать новый конфиг.
Добавил это в мой Dockerfile:
# Install Oracle instantclient and oci8 extension
RUN mkdir /opt/oracle \
&& curl 'https://download.oracle.com/otn_software/linux/instantclient/19600/instantclient-basic-linux.x64-19.6.0.0.0dbru.zip' --output /opt/oracle/instantclient-basic-linux.zip \
&& curl 'https://download.oracle.com/otn_software/linux/instantclient/19600/instantclient-sdk-linux.x64-19.6.0.0.0dbru.zip' --output /opt/oracle/instantclient-sdk-linux.zip \
&& unzip '/opt/oracle/instantclient-basic-linux.zip' -d /opt/oracle \
&& unzip '/opt/oracle/instantclient-sdk-linux.zip' -d /opt/oracle \
&& rm /opt/oracle/instantclient-*.zip \
&& mv /opt/oracle/instantclient_* /opt/oracle/instantclient \
&& docker-php-ext-configure oci8 --with-oci8=instantclient,/opt/oracle/instantclient \
&& docker-php-ext-install oci8 \
&& echo /opt/oracle/instantclient/ > /etc/ld.so.conf.d/oracle-insantclient.conf \
&& ldconfig
Кстати, libaio1 также необходимо установить.
У меня такая же проблема
"php -v
Предупреждение PHP: запуск PHP: невозможно загрузить динамическую библиотеку 'oci8.so' (попробовал: /usr/lib/php/20190902/oci8.so (libaio.so.1: невозможно открыть файл общих объектов: такого файла или каталога нет) , /usr/lib/php/20190902/oci8.so.so (/usr/lib/php/20190902/oci8.so.so: невозможно открыть файл общих объектов: нет такого файла или каталога)) в Неизвестно в строке 0 "
Я решил это с помощью следующей команды
apt-get установить libaio1
Следуйте этому руководству для полной установки https://gist.github.com/milo/d4a15d67e6538bf82438babc39482b80
У меня была проблема с php8: я создал файл etc/apache/envvars. В нем я написал:
Затем важно, как перезапускается апач (в моем случае перезапуск systemctl не работал). Я сделал: apache2ctl остановить apache2ctl запустить
... и все было хорошо.
Я столкнулся с этой проблемой с php8.1 в Ubuntu и хотел поделиться тем, как я ее решил, поскольку я никогда не нашел решения ни в одном руководстве в Интернете. В моей системе установлено несколько версий php, и хотя мой сервер настроен на использование php8.1, поскольку в моей системе была версия 8.2, процесс сборки oci8 происходил с php8.2.
Единственный способ обнаружить это — прочитать сообщение об ошибке, которое выдавал php -i:
Предупреждение PHP: запуск PHP: невозможно загрузить динамическую библиотеку oci8.so (пробовал: /usr/lib/php/20210902/oci8.so (/usr/lib/php/20210902/oci8.so: невозможно открыть файл общего объекта) : нет такого файла или каталога), /usr/lib/php/20210902/oci8.so.so (/usr/lib/php/20210902/oci8.so.so: невозможно открыть общий объектный файл: нет такого файла или каталога)) в Неизвестно в строке 0
и сравнил это с тем, что я видел в конце сборки oci8.
Процесс сборки успешно завершен. Установка '/usr/lib/php/20220829/oci8.so' установлена нормально: параметр конфигурации канала://pecl.php.net/oci8-3.3.0 "php_ini" не установлен в местоположение php.ini Вам следует добавить «extension=oci8.so» в php.ini.
Очевидно, что php искал каталог, отличный от того, в котором создавался oci8. Сначала я устал создавать символическую ссылку на файл, созданный сборкой, в каталог, в котором искал php, но это вернуло эту ошибку.
Предупреждение PHP: Запуск PHP: oci8: невозможно инициализировать модуль Модуль, скомпилированный с модулем API=20220829PHP, скомпилированный с модулем API=20210902 Эти параметры должны совпадать
Именно тогда я понял, что версия PHP, которую я использовал, влияет на окончательный файл сборки. После настройки моих команд для указания php8.1 и версии oci8, совместимой с 8.1, все заработало как надо.
Сначала установите правильную версию php-dev.
sudo apt-get install php8.1-dev php-pear build-essential libaio1 -y
Затем установите правильную версию oci8 для php8.1. Версии перечислены здесь .
sudo pecl channel-update pecl.php.net
sudo pecl -d php_suffix=8.1 install pecl install oci8-3.2.1
Надеюсь, это поможет любому, кто борется с подобной ошибкой.