2

我们和这个人几乎有同样的问题:

apache 使用 php5 运行时找不到 OCI8 函数

他们的问题和我们的不同之处在于我们只有一个 php.ini (/etc/php.ini)。我们在 CentOS 5.5 上运行 PHP 5.3.5 和 Apache 2.2.3。正如你所看到的,他们的问题从未得到真正的回答,但我希望你们都可以帮助我们的问题。谢谢!

4

3 回答 3

2

我找到了问题的原因,但我不知道如何永久解决它。显然,我们的测试服务器使用 SELinux 设置为“强制”。将其设置为“Permissive”允许 Apache/PHP 运行 oci8 扩展。但是,我的老板希望 SELinux 重新设置为“强制执行”,对此我不怪她。我将研究为 Oracle/oci8 创建一个异常。

于 2011-03-09T16:24:42.840 回答
1

回覆。作为 Apache 模块运行时的 SELinux 和 OCI8

来自http://old.nabble.com/php-with-oci8-td16460446.html的建议解决方案

您可以使用 audit2allow 自定义策略以允许此访问

# grep http /var/log/audit/audit.log | audit2allow -M myhttp 
# semodule -i myhttp.pp 

这应该允许您在强制模式下使用 SELinux 运行这些 oracle 应用程序。

在oracle 论坛上也有一个关于此的主题

于 2011-03-09T17:23:11.173 回答
0

确保您在 Apache 环境变量中有 ORACLE_HOME、ORACLE_SID 和 LD_LIBRARY_PATH。请记住,Apache 是作为守护程序运行的,因此它不一定可以访问与从命令行运行 PHP 脚本时相同的环境变量。

ORACLE_HOME=/u01/app/oracle/product/10.1
ORACLE_SID=orcl
export ORACLE_HOME ORACLE_SID
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}

根据您的数据库服务器所在的位置以及连接方式,您可能还需要设置 TWO_TASK 或 TNS_ADMIN。为确保使用正确的字符集,您可能还需要设置 NLS_LANG。

编辑

我通常从源代码构建 PHP,所以我可以完全控制:

假设标准 Oracle 客户端正在服务器上运行,那么我的 ./configure 包括:

--with-pdo-oci=$ORACLE_HOME

有几次我需要为 Oracle 即时客户端构建时,我使用过

--with-pdo-oci=instantclient,/usr,10.2.0.3

在我的 ./configure 行

请注意,我使用的是 PDO_OCI 而不是 OCI8,但 ./configure 应该类似

我在部署到新服务器时采取的另一个步骤是确保 apache 用户/组(由 httpd.conf 中的 User 和 Group 指令定义...我的 apache 作为用户“守护进程”运行)将读取并ORACLE_HOME 下文件的执行权限

于 2011-03-07T21:58:42.850 回答