文件导入

solaris配置php支持oci,错误 oci8.so - libnnz11.so: open f

解决“
[text]
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/php/5.2/modules/oci8.so' -
ld.so.1: httpd: fatal: libnnz11.so: open failed: No such file or directory in Unknown on line 0
[/text]

的方法。
如果你看到这,不知道我在说什么,那就不用看了,看了也没用。
如果你知道我在说什么,99%,你是碰到问题,在网上搜过来的,这篇文章就是用来解决这个问题。

环境:solaris 11, apache 2.2.20, php 5.2.17
[bash]
web@web:~$ cat /etc/release
[/bash]
[text]
Oracle Solaris 11 11/11 SPARC
Copyright (c) 1983, 2011, Oracle and/or its affiliates. All rights reserved.
Assembled 18 October 2011
[/text]
[bash]
web@web:~$ /usr/apache2/2.2/bin/apachectl -v
[/bash]
[text]
Server version: Apache/2.2.20 (Unix)
Server built: Oct 17 2011 15:40:52
[/text]
[bash]
web@web:~$ php --version
[/bash]
[text]
PHP 5.2.17 (cli) (built: Oct 17 2011 18:12:22)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
[/text]

出现这个错误是因为oci8的module load的时候,找不到libnnz11.so
如果你确实把已经安装oracle的库,比如我装了Oracle Database Instant Client, 但是php或者apache中运行phpinfo()找不到,请继续
如果还没装,装一个
https://www.oracle.com/technetwork/database/features/instant-client/index-100365.html
[bash]
web@web:~$ ls /usr/local/oracle/instantclient_11_2/
[/bash]
[text]
BASIC_README genezi libclntsh.so.11.1 libocci.so.11.1 libocijdbc11.so ojdbc6.jar uidrvci
adrci libclntsh.so libnnz11.so libociei.so ojdbc5.jar sdk xstreams.jar
[/text]

出现这个问题,大致有两种情况.
1. php找不到这个库,shell中跑php命令,报错
最简单的测试方法是写个php文件info.php,里面运行phpinfo()
用命令行:
[bash]
php info.php
[/bash]
刷出这个错误,非常好搞定,LD_LIBRARY_PATH的问题,在shell环境中添加 LD_LIBRARY_PATH=$ORACLE_HOME/lib 即可搞定,
我的情况是添加:
[text]
LD_LIBRARY_PATH=/usr/local/oracle/instantclient_11_2:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
[/text]
没有lib文件夹,是因为我装的是Oracle Database Instant Client,没有完整安装oracle数据库

2. 此文重要部分 apache找不到这个库,如果1一切正常,运行
[bash]
web@web:~$ php -m | grep oci8
[/bash]
[text]
oci8
[/text]
能看到oci8,但是在apache服务器中的phpinfo()出错,查看apache的log,发现无法加载oci8模块
[bash]
web@web:~$ grep oci8 /var/apache2/2.2/logs/error_log | uniq
[/bash]
[text]
PHP Warning: PHP Startup: Unable to load dynamic library '/var/php/5.2/modules/oci8.so' - ld.so.1: httpd: fatal: libnnz11.so: open failed: No such file or directory in Unknown on line 0
[/text]

这时的问题在apache,也是我google了大半天也没见到有人搞定的问题,此文重要部分。
在solaris中,apache的服务启动由SMF控制
[bash]
web@web:~$ svcs -l apache22
[/bash]
[text]
fmri svc:/network/http:apache22
name Apache 2.2 HTTP server
enabled true
state online
next_state none
state_time Wed Nov 07 13:56:32 2012
logfile /var/svc/log/network-http:apache22.log
restarter svc:/system/svc/restarter:default
contract_id 708
manifest /lib/svc/manifest/network/http-apache22.xml
dependency require_all/error svc:/milestone/network:default (online)
dependency require_all/none svc:/system/filesystem/local:default (online)
dependency optional_all/error svc:/system/filesystem/autofs:default (online)
[/text]

当然也有命令行可以用,猜测SMF启动apache服务用的也是这个命令,slocate找到apachectl的位置
[bash]
web@web:~$ slocate apachectl
[/bash]
[text]
/usr/share/man/man8/apachectl.8
/usr/apache2/2.2/man/man8/apachectl.8
/usr/apache2/2.2/bin/apachectl
/usr/apache2/2.2/bin/sparcv9/apachectl
[/text]

查看/usr/apache2/2.2/bin/apachectl的内容,会发现,有个envvars的东西,配置apache的环境变量
[text]
43 # the path to your httpd binary, including options if necessary
44 HTTPD='/usr/apache2/2.2/bin/httpd'
45 #
46 # pick up any necessary environment variables
47 if test -f /usr/apache2/2.2/bin/envvars; then
48 . /usr/apache2/2.2/bin/envvars
49 fi
[/text]
顺藤摸瓜,继续查看/usr/apache2/2.2/bin/envvars的内容,此处展示的是已经修的改LD_LIBRARY_PATH,问题就是这样搞定
[text]
17 # envvars-std - default environment variables for apachectl
18 #
19 # This file is generated from envvars-std.in
20 #
21 #LD_LIBRARY_PATH="/usr/apache2/2.2/lib:$LD_LIBRARY_PATH"
22 LD_LIBRARY_PATH="/usr/local/oracle/instantclient_11_2:/usr/apache2/2.2/lib:$LD_LIBRARY_PATH"
23 export LD_LIBRARY_PATH
24 #
25
26 if [ -f /etc/apache2/2.2/envvars ]; then
27 . /etc/apache2/2.2/envvars
28 fi
[/text]
/etc/apache2/2.2/envvars 是个空文件,不多说
当然,我们也注意到里面说 envvars-std - default environment variables for apachectl
[bash]
web@web:/etc/apache2/2.2$ slocate envvars-std
[/bash]
[text]
/usr/apache2/2.2/bin/envvars-std
/usr/apache2/2.2/bin/sparcv9/envvars-std
[/text]
继续查看bin/envvars-std
[text]
17 # envvars-std - default environment variables for apachectl
18 #
19 # This file is generated from envvars-std.in
20 #
21 LD_LIBRARY_PATH="/usr/apache2/2.2/lib:$LD_LIBRARY_PATH"
22 export LD_LIBRARY_PATH
[/text]
是否要修改?暂时不修改,重启系统测试,apache里的phpinfo()显示正常加载oci8模块
那这个文件是什么用途,不清楚,暂时留这不做修改。
至于里面不断提到的envvars-std.in,在系统中没有找到

总结起来,就是LD_LIBRARY_PATH的问题,只是apache的问题比较隐蔽,要找到配置的位置
同理,如果是linux,找到环境变量配置位置进行修改即可。
如果是windows,估计类似,不会,自己搞去吧

评论