Невозможно загрузить динамическую библиотеку '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

Надеюсь, это поможет любому, кто борется с подобной ошибкой.

Другие вопросы по тегам