OCI8使用命令行但不使用apache

时间:2018-12-17 12:52:25

标签: php apache centos7 oci

我的服务器是centos7,我设法在上面安装了apache,php7.1,oracle-instantclient18.3-basic和oci8。 当我在CLI上运行代码时,OCI8现在运行良好,它连接数据库并获取数据,只有一个警告(在运行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

phpinfo()返回:

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上却无法正常工作,这很奇怪。有帮助吗?

3 个答案:

答案 0 :(得分:0)

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

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

10-pdo.ini:

extension=pdo.so

20-pdo-mysql.ini:

extension=pdo_mysql.so

请注意,文件10-pdo.ini仅由于文件名而早于20-pdo-mysql.ini加载。

祝你好运。

答案 1 :(得分:0)

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

如果此计算机上没有其他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文件。

答案 2 :(得分:0)

感谢您的宝贵时间,实际上我确实已重新安装了所有环境,这对于它的生产服务器来说是很痛苦的,但是却得到了回报。 当我已经设置了mysql&Instantclient时,我删除了php&httpd,然后按照以下说明重新安装了它们:

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

然后:

service httpd restart

现在可以了。