PHP oci8 не устанавливается через pecl: фатальная ошибка: oci8_dtrace_gen.h

Я пытаюсь подключить свой веб-сервер Fedora 25 - php к базе данных Oracle.

Для этого мне нужно установить pecl oci8.

Однако я получаю эту ошибку:

/bin/sh /var/tmp/pear-build-roottqYEC6/oci8-2.1.4/libtool --mode=compile cc  -I. -I/var/tmp/oci8 -DPHP_ATOM_INC -I/var/tmp/pear-build-roottqYEC6/oci8-2.1.4/include -I/var/tmp/pear-build-roottqYEC6/oci8-2.1.4/main -I/var/tmp/oci8 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/usr/include/oracle/12.1/client64  -DHAVE_CONFIG_H  -g -O2   -c /var/tmp/oci8/oci8.c -o oci8.lo
libtool: compile:  cc -I. -I/var/tmp/oci8 -DPHP_ATOM_INC -I/var/tmp/pear-build-roottqYEC6/oci8-2.1.4/include -I/var/tmp/pear-build-roottqYEC6/oci8-2.1.4/main -I/var/tmp/oci8 -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/usr/include/oracle/12.1/client64 -DHAVE_CONFIG_H -g -O2 -c /var/tmp/oci8/oci8.c  -fPIC -DPIC -o .libs/oci8.o
In file included from /var/tmp/oci8/oci8.c:49:0:
/var/tmp/oci8/php_oci8_int.h:46:29: fatal error: oci8_dtrace_gen.h: No such file or directory
 #include "oci8_dtrace_gen.h"
                             ^
compilation terminated.
Makefile:196: recipe for target 'oci8.lo' failed
make: *** [oci8.lo] Error 1
ERROR: `make' failed

Я не знаю что делать. Я везде искал решение, и я могу найти только устаревшие статьи.

Любая помощь высоко ценится!


person BidonPython    schedule 24.05.2017    source источник


Ответы (4)


Похоже, ваш PHP был собран с включенной поддержкой DTrace. Из-за некоторых ограничений, связанных с файлами сборки и конфигурации PHP, для установки PECL OCI8 требуется подсказка, чтобы также выполнить сборку с помощью DTrace:

$ export PHP_DTRACE=yes
$ pecl install oci8

Это упоминается в http://php.net/manual/en/oci8.dtrace.php

person Christopher Jones    schedule 30.05.2017
comment
Сначала это сработало для меня: yum install systemtap-sdt-devel && export PHP_DTRACE=yes - person Richard; 16.03.2019
comment
Спасибо за это, люблю тебя, приятель! :) - person Jcc.Sanabria; 21.05.2019
comment
Отличный ответ! Если вам нужно установить oci8 с помощью sudo, вы можете передать переменную среды PHP_DTRACE следующим образом, так как sudo может запускать pecl в отдельной среде, которая может не наследовать все/какие-либо экспортированные переменные: sudo PHP_DTRACE=yes pecl install oci8 — это отлично сработало для меня на коробке RHEL7. - person bluebinary; 29.07.2020
comment
Это не сработало с oci8-2.0.0, но сработало с oci8-2.0.8, спасибо - person gkephorus; 05.03.2021

Примечание. Я получил тот же oci8_dtrace_gen.h, но «sudo yum install systemtap-sdt-devel && export PHP_DTRACE=yes && pecl install oci8» не помог (добавлен шаг systemtap-stp-devel, поскольку комментарий ниже напомнил мне, что я читал в некоторых статью о том, что я должен был установить его для DTRACE).

Мне пришлось вручную собрать, что рекомендовали некоторые статьи:

$ sudo yum install php-pear php-devel
$ pear download pecl/oci8 
$ tar xvzf oci8-2.1.8.tgz 
$ cd oci8-2.1.8/
$ phpize
# make sure of the instantclient path below... mine was version 18.3 so it was located in this folder... Also make note some tutorials ask for the ORACLE_HOME folder which theoretically is /usr/lib/oracle/18.3/client64 but if its instantclient then put the lib folder underneath it (worked for me at least:)
$ ./configure --with-oci8=instantclient,/usr/lib/oracle/18.3/client64/lib
$ make 
$ make install
#NOW an .so file built in: /usr/lib64/php/modules/oci8.so
#THIS STEP NOT NEEDED if SELinux disabled on your server/box, but if SELinux is enabled run: setsebool -P httpd_execmem 1
#NOW add:     extension=oci8.so     at the bottom of your php.ini file (probab in /etc/php.ini)
$ sudo service httpd restart
# note that you can also install PDO_OCI to connect to oracle but its very old and not as good as OCI8 lib (and maybe dependent on having OCI8 anyway)

Beforehand you may want to test and make sure the instantclient libs installed correctly by trying sqlplus:

$ sudo rpm -ivh oracle-instantclient18.3-basic-18.3.0.0.0-1.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient18.3-sqlplus-18.3.0.0.0-1.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient18.3-devel-18.3.0.0.0-1.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient18.3-tools-18.3.0.0.0-1.x86_64.rpm
#add your TNSNAMES connection string info below to this file
$ sudo touch /usr/lib/oracle/18.3/client64/network/admin/tnsnames.ora 
$ vi ~/.bash_profile
#add below info to bash_profile to test sqlplus
ORACLE_HOME=/usr/lib/oracle/18.3/client64
export ORACLE_HOME
PATH=$PATH:$ORACLE_HOME/bin
export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH
TNS_ADMIN=$ORACLE_HOME/lib/network/admin
export TNS_ADMIN
# log out and log back in and test, sqlplus should have access to TNS_ADMIN now
$ sqlplus username/pass@TNSNAMES_SHORTCUT_OF_THE_DB_CONNECTION

и после этого вы можете проверить вывод phpinfo(), чтобы убедиться, что apache имеет доступ к переменным ORACLE_HOME, TNS_ADMIN, LD_LIBRARY_PATH в разделе Environment (я определил их в /etc/sysconfig/httpd).

Затем вы можете протестировать OCI с помощью простого сценария, подобного этому... Я поместил различные форматы строк подключения, которые работали для меня, которые вы можете раскомментировать и протестировать (некоторые зависят от стиля EZCONNECT или предполагают, что у вас правильно настроен TNS_ADMIN. 1-й раскомментированный $db один простейший):

<?php

//works
// ... as long as $TNS_NAMES is defined and passed to apache correctly (using /etc/sysconfig/httpd to add the var.... after defined ORACLE_HOME in there, DONT USE $ORACLE_HOME to define the rest of the vars like for TNS_ADMIN... aka dont do this: TNS_ADMIN=$ORACLE_HOME/lib/network/admin ... use full path: TNS_ADMIN=/usr/lib/oracle/18.3/client64/lib/network/admin )
$username = "myusername";
$password = "mypassword\$2"; //note: may need to escape some chars here like for me i had to escape $ with a backslash
$db = "TNSNAMES_SHORTCUT_OF_THE_DB_CONNECTION";

// works
/*
$db = <<<EOT
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=mydbhost.example.com)
      (PORT=1521)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=name.of.the.service.here)
    )
 )
EOT;
*/

//works, double-check with your DBA as maybe you want to connect to a specific SID or different connection string format
//$db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = mydbhost.example.com)(PORT = 1521)))(CONNECT_DATA=(SERVER=dedicated)(SERVICE_NAME=name.of.the.service.here)))";

// works
// ezconnect format: username/password@[//]host[:port][/service_name] (username and pass are already in oci_connect function so removed from below)
//$db = '//mydbhost.example.com:1521/name.of.the.service.here';

$conn = oci_connect( $username, $password, $db);
if (!$conn) {
  $m = oci_error();
  trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$sql = "select SYSDATE from DUAL";
$stid = oci_parse($conn, $sql);
oci_execute($stid);
while ($row = oci_fetch_array ($stid)) {
  echo $row[0]."&lt;br&gt;";
}
oci_free_statement($stid);
oci_close($conn);
person armyofda12mnkeys    schedule 14.11.2018
comment
Это мне очень помогло. У меня была та же проблема, и мне пришлось сделать следующее: 1) Исправить переменные среды 2) 'export PHP_DTRACE=yes' 3) установить systemtap-sdt-devel Наконец, мне пришлось выполнить ваши действия из: $ ./configure -- with-oci8=instantclient,/usr/lib/oracle/18.3/client64/lib $ make $ make install $ setsebool -P httpd_execmem 1 #add: extension=oci8.so в файле php.ini $ sudo service httpd перезапуск Большое спасибо . - person Mike Aguilar; 15.11.2018
comment
Превосходно! Очень полезно. oci8 теперь установлен, и теперь мое приложение laravel может получить доступ к оракулу! - person Beefjeff; 17.05.2019

Мне не удалось заставить установку пакета RPM работать на моем сервере Centos 6, поэтому я попытался выполнить ручную установку, но столкнулся с рядом проблем, включая проблему с параметром DTRACE.

Вот что я сделал для обновления OCI8 (после обновления до PHP 7.3 сломалось веб-приложение).

Надеюсь, это может быть полезно для кого-то еще.

Загрузите Zip-файлы Instant Client из Oracle и извлеките их на сервер (мне пришлось сначала загрузить их из браузера, а затем передать их на сервер):

cd /u01/app/oracle/product/InstClient/
unzip instantclient-basic-linux.x64-11.2.0.4.0.zip

Это создает подкаталог Instantclient_11_2, разархивируйте SDK в то же место:

unzip instantclient-sdk-linux.x64-11.2.0.4.0.zip

Отредактируйте /etc/sysconfig/httpd и укажите LD_LIBABRY_PATH на новый домашний каталог Instantclient_11_2.

Sym связывает библиотеку:

ln -s /u01/app/oracle/product/InstClient/instantclient_11_2/libclntsh.so.11.1  /u01/app/oracle/product/InstClient/instantcliet_11_2/libclntsh.so

Получите исходный пакет oci8 с php.net:

wget https://pecl.php.net/get/oci8-2.2.0.tgz
tar xf oci8-2.2.0.tgz
cd oci8-2.2.0
phpize

Требуется обновить autoconf и установить systemtap-sdt-devel

wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
gunzip autoconf-latest.tar.gz
tar xf autoconf-latest.tar
cd autoconf-2.69
./configure
make
make install
yum install systemtap-sdt-devel

Продолжить с OCI8:

cd ../oci8-2.2.0
phpize
phpize 7.3
export PHP_DTRACE=yes
./configure --with-oci8=instantclient,/u01/app/oracle/product/InstClient/instantclient_11_2 --with-php-config=/usr/bin/php-config
make
make test

Тест сообщил о большом количестве FAIL, но считается, что из-за отсутствия правильных учетных данных для входа в БД, поэтому продолжение:

make install
ls -ltr /usr/lib64/php/modules/ # check oci8.so is updated

service httpd restart
php -v # No OCI8 error reported and web app working
person TenG    schedule 02.09.2020
comment
Спасибо за подробности. Я настоятельно рекомендую использовать более новый мгновенный клиент, такой как 19c. Версия 19c будет подключаться к Oracle DB 11.2 или более поздней версии. - person Christopher Jones; 04.09.2020

Кое-что, о чем следует знать - установка oci8 по умолчанию предназначена для PHP8. Я получал ту же ошибку, пока не проверил веб-сайт PECL.

Вместо этого попробуйте запустить это: pecl install oci8-2.2.0

person Xaraxia    schedule 17.12.2020