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
现在可以使用了。
我的服务器是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
现在可以使用了。