繁体   English   中英

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

[英]PHP oci8 won't install through pecl: "fatal error: oci8_dtrace_gen.h"

我正在尝试将我的 fedora 25 网络服务器 - php 连接到 Oracle db。

为此,我需要 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

我不知道该怎么办。 我到处找解决办法,也只能找到过时的文章。

非常感谢任何帮助!

您的 PHP 似乎是在启用 DTrace 支持的情况下构建的。 由于 PHP 构建和配置文件的一些限制,PECL OCI8 安装需要一个提示才能使用 DTrace 构建:

$ export PHP_DTRACE=yes
$ pecl install oci8

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

注意:我得到了相同的 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 变量(我在 /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);

我无法在 Centos 6 服务器上安装 RPM 软件包,因此我尝试手动安装,但遇到了许多问题,包括 DTRACE 选项的问题。

这是我升级 OCI8 所做的事情(升级到 PHP 7.3 后破坏了 webapp)。

希望这可能对其他人有用。

从 Oracle 下载 Instant Client Zip 文件并在服务器上解压缩(我首先从浏览器下载它们,然后将它们 SCP 到服务器):

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指向新的LD_LIBABRY_PATH主页。

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

从 php.net 获取 oci8 源码包:

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

测试报告了很多失败,但估计是由于没有正确的数据库登录凭据,所以继续:

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

需要注意的事情 - 默认的 oci8 安装是针对 PHP8 的。 我遇到了同样的错误,直到我检查了 PECL 网站。

尝试运行它: pecl install oci8-2.2.0

我解决了,我确保它值得dtrace --help在我在终端sudo PHP_DTRACE=yes pecl install启动之后。 然后在此提示符中输入“instantclient”。 在此之后 make 应该继续,然后你只需要编辑你的“/etc/php.ini”文件,在文件的最底部添加“extension=oci8.so”,然后重新启动你的 httpd 或 nginx 服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM