OCI8 使用命令行而不是 apache

OCI8 working with the command line but not on apache

我的服务器是centos7,我设法在上面安装了apache,php7.1,oracle-instantclient18.3-basic和oci8。 OCI8 现在工作正常,当我 运行 CLI 上的代码时,它连接数据库并获取数据,只有一个警告(也出现在 运行ning php -v) :

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_oci.so' - /usr/lib64/php/modules/pdo_oci.so: undefined symbol: php_pdo_unregister_driver in Unknown on line 0

与我通过浏览器(在客户端计算机上)打开页面时出现的错误不同:

Fatal error: Uncaught Error: Call to undefined function oci_connect() in /var/www/html/pcmapi/emp.php:5 Stack trace: #0 {main} thrown in /var/www/html/pcmapi/emp.php on line 5

php信息() returns:

oci8
OCI8 Support => enabled
OCI8 DTrace Support => enabled
OCI8 Version => 2.1.8
Oracle Run-time Client Library Version => 18.3.0.0.0
Oracle Compile-time Instant Client Version => 18.3

Directive => Local Value => Master Value
oci8.connection_class => no value => no value
oci8.default_prefetch => 100 => 100
oci8.events => Off => Off
oci8.max_persistent => -1 => -1
oci8.old_oci_close_semantics => Off => Off
oci8.persistent_timeout => -1 => -1
oci8.ping_interval => 60 => 60
oci8.privileged_connect => Off => Off
oci8.statement_cache_size => 20 => 20

我实际上无法识别导致致命错误的原因,无论是在 apache 还是 oci 配置中,我觉得奇怪的是 oci 函数在 cli 上运行良好,但在 apache 上运行良好。有帮助吗?

解决方案是确保在加载 pdo_oci.so 之前加载 pdo.so

我不知道您使用的确切配置,但是在 Ubuntu 上,例如,我在 pdo.so 之后通过将这些配置文件放在 PHP 的 conf.d:

10-pdo.ini:

extension=pdo.so

20-pdo-mysql.ini:

extension=pdo_mysql.so

请注意,文件 10-pdo.ini 将比 20-pdo-mysql.ini 加载得更早,这仅仅是因为它的文件名。

祝你好运。

常见问题是 Apache 的库搜索路径中没有 Oracle 客户端库(例如 Instant Client)。 PHP 在命令行中工作的原因是因为您的 shell 确实 正确设置了库搜索路径。

如果您在此计算机上没有其他 Oracle 库,则执行:

  sudo sh -c "echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf"
  sudo ldconfig

如果您确实有其他软件会发生冲突,请执行编辑 /etc/sysconfig/httpd 之类的操作并添加:

LD_LIBRARY_PATH=/usr/lib/oracle/18.3/client64/lib

根据您的 Apache 版本,您设置环境的方式会有所不同(耶!)

您可能需要也可能不需要导出:

export LD_LIBRARY_PATH=/usr/lib/oracle/18.3/client64/lib

在其他系统上,您可以使用 Apache envvars 文件。

感谢您的宝贵时间,我实际上重新安装了所有环境,作为生产服务器,这很痛苦,但得到了回报.. 虽然我已经设置了 mysql 和 instantclient,但我删除了 php 和 httpd,然后按以下方式重新安装它们:

yum install httpd php php-mysql php-devel php-oci8 php-pear mod_ssl

然后:

service httpd restart

现在可以使用了。