PHP oci8无法通过pecl安装:“严重错误:oci8_dtrace_gen.h”

Jam*_*sPy 2 php lamp pdo oci8 fedora-25

我试图将我的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
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么办。我到处都在寻找解决方案,但我只能找到过时的文章。

任何帮助,不胜感激!

Chr*_*nes 8

看来您的PHP是在启用DTrace支持的情况下构建的。由于PHP构建和配置文件的某些限制,PECL OCI8安装需要使用DTrace进行构建的提示:

$ export PHP_DTRACE=yes
$ pecl install oci8
Run Code Online (Sandbox Code Playgroud)

这在http://php.net/manual/en/oci8.dtrace.php中提到

  • 这样做首先对我有用: yum install systemtap-sdt-devel && export PHP_DTRACE=yes (2认同)
  • 很好的答案!如果您需要使用“sudo”安装“oci8”,则可以按如下方式传递“PHP_DTRACE”环境变量,因为“sudo”可能会在可能不会继承所有/任何导出变量的单独环境中运行“pecl”:“sudo” PHP_DTRACE=yes pecl install oci8` – 这对我在 RHEL7 机器上运行得非常好。 (2认同)

arm*_*eys 5

注意:我得到了相同的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
Run Code Online (Sandbox Code Playgroud)

然后,您可能需要检查phpinfo()输出,以确保apache可以在其Environment部分中访问ORACLE_HOME,TNS_ADMIN,LD_LIBRARY_PATH变量(我在/ etc / sysconfig / httpd中定义了这些变量)。

然后,您可以使用这样的简单脚本测试OCI ...我放了各种对我有用的连接字符串格式,您可以取消注释和测试(某些依赖于EZCONNECT样式或假设您正确设置了TNS_ADMIN。第一个未注释的$ 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);
Run Code Online (Sandbox Code Playgroud)

  • 这对我很有帮助。我遇到了同样的问题,我必须这样做: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 in php.ini file $ sudo service httpd restart非常感谢。 (2认同)