我正在尝试设置本地开发箱。该箱位于 Linux Mint 上。安装了 apache、php 和 mysql 没有任何问题,然后我继续安装 Oracle Xpress Edition,因为我的最新项目需要它。
oci8.so
通过pecl并修改得到php.ini
。
问题是,每次我重新启动并尝试使用oci_connect()
调用连接到 oracle 时,都会出现此错误:
oci_connect() [function.oci-connect]: OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME is set and points to the right directory
我已经检查过ORACLE_HOME
错误发生时的情况并且它似乎包含正确的值。
现在,我可以通过进入终端来解决这个问题
$ su
$ apache2ctl stop
$ apache2ctl start
这是解决问题的唯一方法(即不是sudo apache2ctl restart
、不是sudo apache2ctl {stop,start}
、不是su apache2ctl restart
)。
我知道这只是个小问题,我可能可以忍受。但如果有人能指点我如何完成这项工作,我将不胜感激。
答案1
ORACLE_HOME
另一个选项是在 apachehttpd.conf
或使用它的虚拟主机中进行设置。
添加:
SetEnv ORACLE_HOME "/path/to/oracle/home"
到httpd.conf
(或在虚拟主机配置文件内/etc/apache2/hosts-enabled/...
)
这样做的好处是不需要弄乱系统脚本。
答案2
听起来启动 Apache 的 init 脚本没有设置正确的环境变量(该脚本可能位于 的某个地方/etc/init.d
)。当您手动重新启动它时,它会起作用,因为你的shell 已ORACLE_HOME
正确设置,并将其传递给 Apache。
解决方案是修改 Oracle 的系统启动脚本以设置ORACLE_HOME
环境变量。它甚至可能有一些自动设置外部变量的方法(在 Red Hat 风格的系统上,大多数 init 脚本都以 为源文件/etc/sysconfig
,因此您应该查看 init 脚本以查看它是否从某个地方获取文件。这样,如果您升级 Oracle 并更新 init 脚本,您的更改就不会被忽略)。
答案3
我见过 SELinux 导致的这种情况。我不得不暂时禁用 SELinux 来安装 Oracle 驱动程序,然后当我重新启动时,Oracle 驱动程序没有加载。Apache 日志显示:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/oci8.so' - libnnz11.so: cannot enable executable stack as shared object requires: Permission denied in Unknown on line 0
根据这个有用的页面,您可以告诉 SELinux 允许 Oracle 驱动程序:
execstack -c /usr/lib64/php/modules/oci8.so
你也可以采取更彻底的措施,完全禁用 SELinux。在 /etc/selinux/config 中,将“SELINUX=enforcing”更改为“SELINUX=disabled”